*.py
디렉토리 및 모든 하위 디렉토리 에있는 특정 유형의 모든 파일 ( 예 :)에 대한 요약 md5 체크섬을 계산해야합니다 .
가장 좋은 방법은 무엇입니까?
편집 : 제안 된 솔루션은 매우 훌륭하지만 이것이 정확히 필요한 것은 아닙니다. 모든 하위 디렉토리의 내용을 포함하여 디렉토리를 전체적으로 고유하게 식별 하는 단일 요약 체크섬 을 얻는 솔루션을 찾고 있습니다.
*.py
디렉토리 및 모든 하위 디렉토리 에있는 특정 유형의 모든 파일 ( 예 :)에 대한 요약 md5 체크섬을 계산해야합니다 .
가장 좋은 방법은 무엇입니까?
편집 : 제안 된 솔루션은 매우 훌륭하지만 이것이 정확히 필요한 것은 아닙니다. 모든 하위 디렉토리의 내용을 포함하여 디렉토리를 전체적으로 고유하게 식별 하는 단일 요약 체크섬 을 얻는 솔루션을 찾고 있습니다.
답변:
find /path/to/dir/ -type f -name "*.py" -exec md5sum {} + | awk '{print $1}' | sort | md5sum
find 명령은 .py로 끝나는 모든 파일을 나열합니다. md5sum은 각 .py 파일에 대해 계산됩니다. awk는 md5sum을 선택하는 데 사용됩니다 (파일 이름은 무시할 수 있음). md5sum이 정렬됩니다. 이 정렬 된 목록의 md5sum이 반환됩니다.
테스트 디렉토리를 복사하여 이것을 테스트했습니다.
rsync -a ~/pybin/ ~/pybin2/
~ / pybin2에서 일부 파일의 이름을 변경했습니다.
이 find...md5sum
명령은 두 디렉토리 모두에 대해 동일한 출력을 리턴합니다.
2bcf49a4d19ef9abd284311108d626f1 -
awk ...
는 서명의 레이아웃 부분을 고려 하면 부분을 제거합니다 .
즉시 tar 아카이브 파일을 작성하고 다음으로 파이프하십시오 md5sum
.
tar c dir | md5sum
그러면 파일 및 하위 디렉토리 설정에 고유 한 단일 md5sum이 생성됩니다. 디스크에 파일이 작성되지 않습니다.
ls -alR dir | md5sum
. 압축하지 않고 읽기만하는 것이 더 좋습니다. 내용은 파일의 모드 시간과 크기를 포함하기 때문에 독특합니다.;)
z
gzip 또는 j
bzip2 에 추가해야합니다 . 나는 둘 다하지 않았다.
tar
동일한 파일 세트를 두 번 또는 두 대의 다른 컴퓨터에서 사용한다고해서 동일한 결과를 얻을 것이라는 보장은 없습니다 .
ire_and_curses의 사용 제안 tar c <dir>
에는 몇 가지 문제가 있습니다.
rsync -a --delete
수행 하는 것과 일치합니다. 사실상 모든 것을 (xattrs 및 acls 빼기) 동기화하지만 문자열 표현이 아닌 ID를 기반으로 소유자와 그룹을 동기화합니다. 따라서 반드시 동일한 사용자 / 그룹이없는 다른 시스템에 동기화 한 경우 --numeric-owner
tar에 플래그를 추가해야합니다첫 번째 문제에 대한 해결책이없는 한 (또는 확실하지 않은 경우)이 방법을 사용하지 않습니다.
그만큼 find
그들 만 체크섬 마음 빈 디렉토리에 두어야 당신이 경우에 문제가된다 파일이 아닌 디렉토리를 포함하기 때문에 위의 제안을 기반으로 솔루션은 좋지 않습니다.
마지막으로, 시스템에서 데이터 정렬이 다를 수 있으므로 가장 많이 제안 된 솔루션이 일관되게 정렬되지 않습니다.
이것이 내가 생각해 낸 해결책입니다.
dir=<mydir>; (find "$dir" -type f -exec md5sum {} +; find "$dir" -type d) | LC_ALL=C sort | md5sum
이 솔루션에 대한 참고 사항 :
LC_ALL=C
시스템 전체에서 안정적인 정렬 순서를 보장 입니다-print0
플래그로 수정 find
하지만 여기에 다른 일이 있기 때문에 명령을보다 복잡하게 만드는 솔루션 만 볼 수 있습니다.추신 : 내 시스템 중 하나가 find
지원 -exec
하지 않거나 -print0
플래그 를 지정하지 않는 제한된 busybox 를 사용하며 디렉토리를 나타 내기 위해 '/'를 추가하지만 findutils find는 보이지 않는 것처럼 보입니다.
dir=<mydir>; (find "$dir" -type f | while read f; do md5sum "$f"; done; find "$dir" -type d | sed 's#/$##') | LC_ALL=C sort | md5sum
운 좋게도 이름에 줄 바꿈이있는 파일 / 디렉토리가 없으므로 해당 시스템에서 문제가되지 않습니다.
빈 디렉토리가 아닌 파일 만 신경 쓰면 잘 작동합니다.
find /path -type f | sort -u | xargs cat | md5sum
완전성을 위해 md5deep (1)이 있습니다 . * .py 필터 요구 사항으로 인해 직접 적용되지는 않지만 find (1)과 함께 잘 수행되어야합니다.
나에게 가장 적합한 솔루션 :
find "$path" -type f -print0 | sort -z | xargs -r0 md5sum | md5sum
그것이 나를 위해 가장 효과가 있었던 이유 :
다른 답변 관련 문제 :
파일 시스템 메타 데이터는 다음에 대해 무시되지 않습니다.
tar c - "$path" | md5sum
공백이 포함 된 파일 이름을 처리하지 않거나 파일 이름이 바뀌 었는지 감지하지 않습니다.
find /path -type f | sort -u | xargs cat | md5sum
내용과 파일 이름을 포함한 모든 파일을 체크섬
grep -ar -e . /your/dir | md5sum | cut -c-32
위와 동일하지만 * .py 파일 만 포함
grep -ar -e . --include="*.py" /your/dir | md5sum | cut -c-32
원하는 경우 심볼릭 링크를 따를 수도 있습니다
grep -aR -e . /your/dir | md5sum | cut -c-32
grep과 함께 사용할 수있는 다른 옵션
-s, --no-messages suppress error messages
-D, --devices=ACTION how to handle devices, FIFOs and sockets;
-Z, --null print 0 byte after FILE name
-U, --binary do not strip CR characters at EOL (MSDOS/Windows)
기술적으로 당신은 실행해야합니다 ls -lR *.py | md5sum
. 누군가 파일을 수정하고 원래 날짜로 다시 터치하고 파일 크기를 변경하지 않는 것에 대해 걱정하지 않는 한 출력 결과 ls
는 파일이 변경되었는지 알려줍니다. 내 unix-foo는 약하므로 작성 시간과 인쇄 시간을 수정하기 위해 명령 줄 매개 변수가 더 필요할 수 있습니다. ls
또한 파일에 대한 권한이 변경되었는지 알려줍니다 (그리고 신경 쓰지 않으면 끌 수있는 스위치가 있다고 확신합니다).
touch
파일 의 내용이 아닌 날짜를 변경하는 파일 인 경우 체크섬이 변경되지 않을 것으로 예상합니다.
나는 같은 문제가 있었기 때문에 디렉토리에있는 파일의 md5sum을 나열하는이 스크립트를 생각해 냈고 하위 디렉토리를 찾으면 다시 실행됩니다.이를 위해서는 스크립트가 현재를 통해 실행될 수 있어야합니다 인수가 $ 1로 전달되는 경우 디렉토리 또는 서브 디렉토리에서
#!/bin/bash
if [ -z "$1" ] ; then
# loop in current dir
ls | while read line; do
ecriv=`pwd`"/"$line
if [ -f $ecriv ] ; then
md5sum "$ecriv"
elif [ -d $ecriv ] ; then
sh myScript "$line" # call this script again
fi
done
else # if a directory is specified in argument $1
ls "$1" | while read line; do
ecriv=`pwd`"/$1/"$line
if [ -f $ecriv ] ; then
md5sum "$ecriv"
elif [ -d $ecriv ] ; then
sh myScript "$line"
fi
done
fi