문제

특정 유형의 모든 파일에 대한 요약 MD5 체크섬을 계산해야합니다 (*.py 예를 들어) 디렉토리 및 모든 하위 디렉토리 아래에 배치됩니다.

그렇게하는 가장 좋은 방법은 무엇입니까?

편집하다: 제안 된 솔루션은 매우 좋지만 이것이 바로 내가 필요한 것은 아닙니다. 나는 얻을 수있는 해결책을 찾고있다 단일 요약 모든 하위 디렉토리의 내용을 포함하여 디렉토리 전체를 고유하게 식별하는 CheckSum.

도움이 되었습니까?

해결책

find /path/to/dir/ -type f -name "*.py" -exec md5sum {} + | awk '{print $1}' | sort | md5sum

찾기 명령에는 .py에서 끝나는 모든 파일이 나와 있습니다. MD5SUM은 각 .py 파일에 대해 계산됩니다. AWK는 MD5SUMS를 선택하는 데 사용됩니다 (독특하지 않을 수있는 파일 이름을 무시 함). MD5SUMS가 정렬됩니다. 그런 다음이 분류 된 목록의 MD5SUM이 반환됩니다.

테스트 디렉토리를 복사하여 이것을 테스트했습니다.

rsync -a ~/pybin/ ~/pybin2/

나는 ~/pybin2의 일부 파일의 이름을 바꿨습니다.

그만큼 find...md5sum 명령은 두 디렉토리 모두에 대해 동일한 출력을 반환합니다.

2bcf49a4d19ef9abd284311108d626f1  -

다른 팁

타르 아카이브 파일을 즉시 생성하고 md5sum:

tar c dir | md5sum

이렇게하면 파일 및 하위 디렉토리 설정에 고유 해야하는 단일 MD5SUM이 생성됩니다. 디스크에 파일이 생성되지 않습니다.

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

  • TAR는 파일 시스템에 저장된 순서대로 디렉토리 항목을 처리 하며이 순서를 변경할 방법이 없습니다. 이것은 다른 장소에 "동일한"디렉토리가있는 경우 완전히 다른 결과를 얻을 수 있으며,이를 해결할 방법이 없습니다 (Tar는 특정 순서로 입력 파일을 "정렬 할 수 없습니다).
  • 나는 일반적으로 GroupId와 소유자 번호가 동일하지만 반드시 그룹/소유자의 문자열 표현이 동일하지는 않습니다. 이것은 예를 들어 어떤 것과 일치합니다 rsync -a --delete 수행 : 거의 모든 것을 동기화하지만 (마이너스 XATTRS 및 ACL), String 표현이 아닌 ID를 기반으로 소유자 및 그룹을 동기화합니다. 따라서 반드시 동일한 사용자/그룹이없는 다른 시스템에 동기화 한 경우 추가해야합니다. --numeric-owner 타르에 깃발
  • TAR에는 확인하는 디렉토리의 파일 이름이 포함됩니다.

첫 번째 문제에 대한 해결책이없는 한 (또는 그것이 당신에게 영향을 미치지 않는 한), 나는이 접근법을 사용하지 않을 것입니다.

그만큼 find 위에서 제안한 기반 솔루션은 디렉토리가 아닌 파일 만 포함하기 때문에 좋지 않습니다. 이는 CheckSumming이 빈 디렉토리를 염두에 두어야하는 경우 문제가됩니다.

마지막으로, 대부분의 제안 된 솔루션은 시스템마다 다를 수 있기 때문에 일관되게 정렬되지 않습니다.

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

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

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

  • 그만큼 LC_ALL=C 시스템 전체에서 안정적인 정렬 순서를 보장하는 것입니다
  • 이것은 디렉토리 " nwithanewline"이라는 디렉토리와 두 개의 디렉토리 "이름"및 "Withanewline"을 구별하지 않지만, 그 일이 발생할 가능성은 거의 없을 것 같습니다. 하나는 일반적으로 이것을 a로 수정합니다 -print0 깃발 find 그러나 여기에 다른 일이 진행되고 있기 때문에 명령을 더 복잡하게 만드는 솔루션 만 볼 수 있습니다.

추신 : 내 시스템 중 하나가 제한된 바쁜 상자를 사용합니다. find 지원하지 않습니다 -exec ...도 아니다 -print0 플래그, 또한 디렉토리를 나타내도록 '/'가 추가되지만 FindUtils는 찾을 수 없으므로이 기계의 경우 실행해야합니다.

dir=<mydir>; (find "$dir" -type f | while read f; do md5sum "$f"; done; find "$dir" -type d | sed 's#/$##') | LC_ALL=C sort | md5sum

운 좋게도, 나는 그들의 이름에 Newlines가있는 파일/디렉토리가 없기 때문에 이것은 해당 시스템에 문제가되지 않습니다.

빈 디렉토리가 아닌 파일에만 관심이있는 경우 잘 작동합니다.

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 

컨텐츠와 파일 이름을 포함한 모든 파일의 CheckSum

grep -ar -e . /your/dir | md5sum | cut -c-32

위와 동일하지만 *.py 파일 만 포함

grep -ar -e . --include="*.py" /your/dir | md5sum | cut -c-32

원하는 경우 Symlinks를 팔로우 할 수도 있습니다

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)

GNU 찾기

find /path -type f -name "*.py" -exec md5sum "{}" +;

기술적으로 당신은 달리기 만하면됩니다 ls -lR *.py | md5sum. 누군가가 파일을 수정하고 원래 날짜로 다시 터치하고 파일 크기를 변경하지 않는 것에 대해 걱정하지 않는 한 ls 파일이 변경되었는지 알려주십시오. My Unix-Foo가 약하므로 인쇄 할 시간 및 수정 시간을 얻으려면 더 많은 명령 줄 매개 변수가 필요할 수 있습니다. ls 또한 파일에 대한 권한이 변경되었는지 여부를 알려줄 것입니다 (신경 쓰지 않으면이를 끄는 스위치가 있다고 확신합니다).

해시 코피를 사용하여이를 수행합니다. 단일 파일 또는 디렉토리에서 MD5 및 SHA를 생성하고 확인할 수 있습니다. www.jdxsoftware.org에서 다운로드 할 수 있습니다.

사용 md5deep:

md5deep -r FOLDER | awk '{print $1}' | sort | md5sum

나는 같은 문제가 있었기 때문에 디렉토리에 파일의 md5sums를 나열하는이 스크립트를 생각해 냈으며, 서브 디렉토리를 찾으면 다시 실행되기 때문에 스크립트가 현재를 통해 실행할 수 있어야합니다. 해당 인수가 $ 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

파일 시스템 속성과 일부 TAR 버전의 비트 레벨 차이와 독립을 원한다면 CPIO를 사용할 수 있습니다.

cpio -i -e theDirname | md5sum

두 가지 솔루션이 더 있습니다.

만들다:

du -csxb /path | md5sum > file

ls -alR -I dev -I run -I sys -I tmp -I proc /path | md5sum > /tmp/file

확인하다:

du -csxb /path | md5sum -c file

ls -alR -I dev -I run -I sys -I tmp -I proc /path | md5sum -c /tmp/file

md5sum 나에게 잘 일했지만 문제가있었습니다. sort 파일 이름을 정렬합니다. 대신에 나는 정렬했다 md5sum 결과. 또한 비슷한 결과를 만들려면 일부 파일을 제외해야했습니다.

find . -type f -print0 \ | xargs -r0 md5sum \ | grep -v ".env" \ | grep -v "vendor/autoload.php" \ | grep -v "vendor/composer/" \ | sort -d \ | md5sum

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top