[linux] 디렉토리의 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  -


답변

즉시 tar 아카이브 파일을 작성하고 다음으로 파이프하십시오 md5sum.

tar c dir | md5sum

그러면 파일 및 하위 디렉토리 설정에 고유 한 단일 md5sum이 생성됩니다. 디스크에 파일이 작성되지 않습니다.


답변

ire_and_curses의 사용 제안 tar c <dir>에는 몇 가지 문제가 있습니다.

  • tar는 파일 시스템에 저장된 순서대로 디렉토리 항목을 처리하며이 순서를 변경할 방법이 없습니다. 서로 다른 위치에 “동일한”디렉토리가 있고이 문제를 해결할 방법이없는 경우 (타르가 입력 파일을 특정 순서로 “정렬”할 수없는 경우) 이렇게하면 완전히 다른 결과를 얻을 수 있습니다.
  • 나는 일반적으로 groupid와 ownerid 번호가 같은지에 관심이 있으며, 그룹 / 소유자의 문자열 표현이 반드시 같은지는 아닙니다. 이것은 예를 들어 rsync -a --delete수행 하는 것과 일치합니다. 사실상 모든 것을 (xattrs 및 acls 빼기) 동기화하지만 문자열 표현이 아닌 ID를 기반으로 소유자와 그룹을 동기화합니다. 따라서 반드시 동일한 사용자 / 그룹이없는 다른 시스템에 동기화 한 경우 --numeric-ownertar에 플래그를 추가해야합니다
  • tar는 당신이 확인하고있는 디렉토리의 파일 이름을 포함 할 것입니다.

첫 번째 문제에 대한 해결책이없는 한 (또는 확실하지 않은 경우)이 방법을 사용하지 않습니다.

그만큼 find그들 만 체크섬 마음 빈 디렉토리에 두어야 당신이 경우에 문제가된다 파일이 아닌 디렉토리를 포함하기 때문에 위의 제안을 기반으로 솔루션은 좋지 않습니다.

마지막으로, 시스템에서 데이터 정렬이 다를 수 있으므로 가장 많이 제안 된 솔루션이 일관되게 정렬되지 않습니다.

이것이 내가 생각해 낸 해결책입니다.

dir=<mydir>; (find "$dir" -type f -exec md5sum {} +; find "$dir" -type d) | LC_ALL=C sort | md5sum

이 솔루션에 대한 참고 사항 :

  • 그만큼 LC_ALL=C시스템 전체에서 안정적인 정렬 순서를 보장 입니다
  • 이것은 “named \ nwithanewline”디렉토리와 “named”및 “withanewline”디렉토리 두 개를 구분하지는 않지만 그 가능성은 거의 없습니다. 하나는 일반적으로 이것을 -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

그것이 나를 위해 가장 효과가 있었던 이유 :

  1. 공백이 포함 된 파일 이름을 처리합니다.
  2. 파일 시스템 메타 데이터를 무시합니다
  3. 파일 이름이 변경되었는지 감지

다른 답변 관련 문제 :

파일 시스템 메타 데이터는 다음에 대해 무시되지 않습니다.

tar c - "$path" | md5sum

공백이 포함 된 파일 이름을 처리하지 않거나 파일 이름이 바뀌 었는지 감지하지 않습니다.

find /path -type f | sort -u | xargs cat | md5sum


답변

전체 디렉토리에 걸쳐 하나의 md5sum을 원한다면 다음과 같이하십시오.

cat *.py | md5sum