[linux] Linux : 주어진 폴더 및 콘텐츠에 대해 단일 해시를 계산합니까?

확실히 이것을 쉽게 할 수있는 방법이있을 것입니다!

나는 리눅스 명령 줄과 같은 애플 리케이션 해봤 sha1sum하고 md5sum있지만 개별 파일 및 출력 해시 값 목록, 각 파일에 대해 하나의 해시를 계산 할 수있을 것 같다.

파일 이름뿐만 아니라 폴더의 전체 내용에 대해 단일 해시를 생성해야합니다.

나는 다음과 같은 것을하고 싶다.

sha1sum /folder/of/stuff > singlehashvalue

편집 : 명확히하기 위해 내 파일은 디렉토리 트리의 여러 수준에 있으며 모두 동일한 루트 폴더에 있지 않습니다.



답변

한 가지 가능한 방법은 다음과 같습니다.

sha1sum 경로 / 대상 / 폴더 / * | sha1sum

전체 디렉토리 트리가있는 경우 find 및 xargs를 사용하는 것이 좋습니다. 가능한 명령 중 하나는

경로 / 대상 / 폴더 찾기 -type f -print0 | 정렬 -z | xargs -0 sha1sum | sha1sum

마지막으로 권한과 빈 디렉터리도 고려해야하는 경우 :

(find path/to/folder -type f -print0  | sort -z | xargs -0 sha1sum;
 find path/to/folder \( -type f -o -type d \) -print0 | sort -z | \
   xargs -0 stat -c '%n %a') \
| sha1sum

인수 stat는 파일 이름과 그 뒤에 8 진수 권한을 인쇄하도록합니다. 두 개의 발견은 차례로 실행되어 디스크 IO의 양을 두 배로 늘리고 첫 번째는 모든 파일 이름을 찾고 내용을 체크섬하고 두 번째는 모든 파일 및 디렉토리 이름을 찾고 이름과 모드를 인쇄합니다. “파일 이름 및 체크섬”목록과 그 뒤에 “권한이있는 이름 및 디렉토리”목록이 더 작은 체크섬에 대해 체크섬됩니다.


답변

  • aide 와 같은 파일 시스템 침입 탐지 도구를 사용하십시오 .

  • 디렉토리의 타르 볼을 해시합니다.

    tar cvf - /path/to/folder | sha1sum

  • vatine의 oneliner 와 같이 직접 코딩하십시오 .

    find /path/to/folder -type f -print0 | sort -z | xargs -0 sha1sum | sha1sum


답변

넌 할 수있어 tar -c /path/to/folder | sha1sum


답변

폴더의 내용이 변경되었는지 확인하려면 다음을 권장합니다.

ls -alR --full-time /folder/of/stuff | sha1sum

폴더, 하위 폴더, 파일, 타임 스탬프, 크기 및 권한을 포함하는 ls 출력의 해시 만 제공합니다. 무언가 변경되었는지 확인하는 데 필요한 거의 모든 것.

이 명령은 각 파일에 대해 해시를 생성하지 않지만 find를 사용하는 것보다 더 빠릅니다.


답변

강력하고 깨끗한 접근 방식

  • 먼저 , 사용 가능한 메모리를 잡아 먹지 마십시오 ! 전체 파일을 공급하는 대신 청크로 파일을 해시하십시오.
  • 다양한 요구 / 목적에 대한 다양한 접근 방식 (아래 모두 또는 적용되는 항목 선택) :
    • 디렉토리 트리에있는 모든 항목의 항목 이름 만 해시합니다.
    • 모든 항목의 파일 내용을 해시합니다 (메타를 그대로두고 inode 번호, ctime, atime, mtime, 크기 등).
    • 심볼릭 링크의 경우 내용은 참조 이름입니다. 해시하거나 건너 뛰도록 선택
    • 항목의 내용을 해싱하는 동안 심볼릭 링크를 따르거나 따르지 않을 (확인 된 이름)
    • 디렉토리 인 경우 내용은 디렉토리 항목 일뿐입니다. 재귀 적으로 순회하는 동안 그것들은 결국 해시 될 것이지만이 디렉토리에 태그를 지정하기 위해 해당 레벨의 디렉토리 항목 이름을 해시해야합니까? 콘텐츠를 해시하기 위해 깊이 탐색하지 않고도 변경 사항을 빠르게 식별하기 위해 해시가 필요한 사용 사례에 유용합니다. 예를 들어 파일의 이름이 변경되지만 나머지 내용은 동일하게 유지되고 모두 상당히 큰 파일입니다.
    • 대용량 파일을 잘 처리하십시오 (다시 RAM에 유의하십시오).
    • 매우 깊은 디렉토리 트리 처리 (열린 파일 설명자에 유의)
    • 비표준 파일 이름 처리
    • 소켓, 파이프 / FIFO, 블록 장치, 문자 장치 인 파일을 처리하는 방법은 무엇입니까? 그것들도 해시해야합니까?
    • 통과하는 동안 항목의 액세스 시간을 업데이트하지 마십시오. 이는 특정 사용 사례에 대해 부작용이고 비생산적 (직관적입니까?)이기 때문입니다.

이것은 내가 내 머리 위에 가지고있는 것입니다.이 작업에 시간을 할애 한 사람은 실제로 다른 문제와 코너 케이스를 잡았을 것입니다.

다음 은 대부분의 경우를 처리하는 메모리에 매우 가벼운 도구 이며 가장자리가 약간 거칠지 만 매우 유용합니다.

예 사용 및 출력 dtreetrawl.

Usage:
  dtreetrawl [OPTION...] "/trawl/me" [path2,...]

Help Options:
  -h, --help                Show help options

Application Options:
  -t, --terse               Produce a terse output; parsable.
  -j, --json                Output as JSON
  -d, --delim=:             Character or string delimiter/separator for terse output(default ':')
  -l, --max-level=N         Do not traverse tree beyond N level(s)
  --hash                    Enable hashing(default is MD5).
  -c, --checksum=md5        Valid hashing algorithms: md5, sha1, sha256, sha512.
  -R, --only-root-hash      Output only the root hash. Blank line if --hash is not set
  -N, --no-name-hash        Exclude path name while calculating the root checksum
  -F, --no-content-hash     Do not hash the contents of the file
  -s, --hash-symlink        Include symbolic links' referent name while calculating the root checksum
  -e, --hash-dirent         Include hash of directory entries while calculating root checksum

인간 친화적 인 출력의 일부 :

...
... //clipped
...
/home/lab/linux-4.14-rc8/CREDITS
        Base name                    : CREDITS
        Level                        : 1
        Type                         : regular file
        Referent name                :
        File size                    : 98443 bytes
        I-node number                : 290850
        No. directory entries        : 0
        Permission (octal)           : 0644
        Link count                   : 1
        Ownership                    : UID=0, GID=0
        Preferred I/O block size     : 4096 bytes
        Blocks allocated             : 200
        Last status change           : Tue, 21 Nov 17 21:28:18 +0530
        Last file access             : Thu, 28 Dec 17 00:53:27 +0530
        Last file modification       : Tue, 21 Nov 17 21:28:18 +0530
        Hash                         : 9f0312d130016d103aa5fc9d16a2437e

Stats for /home/lab/linux-4.14-rc8:
        Elapsed time     : 1.305767 s
        Start time       : Sun, 07 Jan 18 03:42:39 +0530
        Root hash        : 434e93111ad6f9335bb4954bc8f4eca4
        Hash type        : md5
        Depth            : 8
        Total,
                size           : 66850916 bytes
                entries        : 12484
                directories    : 763
                regular files  : 11715
                symlinks       : 6
                block devices  : 0
                char devices   : 0
                sockets        : 0
                FIFOs/pipes    : 0


답변

파일 내용을 해시하고 파일 이름을 무시하려면 다음을 사용할 수 있습니다.

cat $FILES | md5sum

해시를 계산할 때 파일이 동일한 순서로 있는지 확인하십시오.

cat $(echo $FILES | sort) | md5sum

그러나 파일 목록에는 디렉토리가있을 수 없습니다.


답변

이를 달성하기위한 또 다른 도구 :

http://md5deep.sourceforge.net/

소리 그대로 : md5sum과 비슷하지만 재귀 적이며 다른 기능도 있습니다.