때로는 대용량 데이터를 저장하기 위해 신뢰할 수 없는 미디어(플래시)를 사용하기도 합니다. 최소한 비트 플립을 식별하기 위해 md5sum을 파일과 함께 저장합니다. 파일은 일반적으로 find -type f -exec "{}" \; >MD5SUM
. 안타깝게도 제가 사용한 일부 기계의 시간이 엉망이 되었기 때문에 그것을 사용하는 것은 find -newer <file> -exec md5sum "{}"\; >>MD5SUM
선택 사항이 아닙니다. 기본적으로 MD5SUM 파일로 생성된 파일 목록 과 MD5SUM 파일의 목록 find -type f
사이의 차이점을 이해하고 싶습니다.
간단하고 우아한 방법으로 이를 수행하는 방법에 대한 아이디어가 있습니까? 미리 감사드립니다!
답변1
이 프로세스가 계속 진행되는 경우 이전 파일과 새 파일(다음번에는 이전 파일이 됨)이라는 두 개의 파일이 필요합니다.
#!/bin/sh
# change directory to either first argument or to current directory
cd ${1:-"."} || exit 1 # if cannot cd, then exit
# get the md5 values for all the files in the directory tree
find . -type f -not -name .md5sum.last -exec md5sum {} \; | sort > .md5sum.tmp
# if called before, then get only the differences in the newer
if [ -f .md5sum.last ]; then
comm -13 .md5sum.last .md5sum.tmp
else # otherwise show all the output
cat .md5sum.tmp
fi
# replace the older with the current for next time
mv .md5sum.tmp .md5sum.last
조화가 핵심 sort
입니다 . comm -13
순서는 분명하지만 comm
("common"의 줄임말) 첫 번째 파일(열 1), 두 번째 파일(열 2) 또는 두 파일(열 3)의 행을 표시합니다. 이 -13
옵션은 "첫 번째 및 세 번째 열 제거"를 의미하며, 이전 열에 속하지 않고 두 열 모두에 공통되지 않는 행만 남깁니다. 불행하게도 파일의 타임스탬프를 신뢰할 수 없다면 이는 대규모 디렉터리 트리에 대해 매우 집약적인 프로세스가 될 것입니다.
답변2
_my_file_
가장 쉬운 방법은 파일의 체크섬을 파일에 저장 _my_file_.md5
하고 모든 체크섬을 단일 파일에 저장하지 않는 것입니다. 이렇게 하면 이전에 컴퓨터가 특정 체크섬을 입력했는지 여부를 더 쉽게 알 수 있습니다.
그러나 플래시 드라이브에 파일만 추가하는 경우(수정하거나 삭제하지 말고 이전에 존재했던 파일을 추가하지 않음) 다음을 수행할 수 있습니다.
find _your_drive_path_ -type f |
while read file; do
grep -q $file _your_md5_file_ || md5sum $file >> _your_md5_file_
done
이것은 grep
여러 번 체크섬 파일이며 파일 목록을 정렬하고 체크섬 파일을 파일 이름별로 정렬하여 최적화할 수 있지만 이러한 최적화가 필요하지 않은 경우 복잡성에 대해 걱정할 이유가 없습니다.
답변3
타임스탬프를 신뢰할 수 없다면 변경된 파일만 처리할 수 있는 방법이 실제로 없습니다. 원래 find
명령을 반복하면 됩니다.
MD5SUM
새 파일을 임시 위치에 저장한 다음 업데이트 diff
된 파일을 플래시에 복사하기 전에 이전 파일과 새 파일을 저장하여 변경된 내용을 확인했습니다. 유용한 차이점을 얻으려면 파일을 정렬해야 할 수도 있습니다.