macos 디렉토리의 shasum

macos 디렉토리의 shasum

shasum저는 디렉토리의 내용이 변경되었는지 확인하기 위해 사용하는 쉘 스크립트를 작성 중입니다 .

Linux와 FreeBSD에서는 shasum동일한 동작을 수행하지만 shasum <directory>MacOS에서는 shasum해시를 제공합니다.파일에만 해당.

FreeBSD

$ shasum CONTENTS/
7f986e5e5289c59db1bba48df92ffe4707830aaa  CONTENTS/

리눅스

$ shasum CONTENTS/
7f986e5e5289c59db1bba48df92ffe4707830aaa  CONTENTS/

맥 OS

$ shasum CONTENTS/
shasum: CONTENTS/: 

MacOS에서 디렉토리의 해시를 어떻게 계산할 수 있나요?

시도 1: 파이프와 함께 TAR 사용

사용해 보았으나 이 tar 옵션이 MacOS에서는 작동하지 않는 것 같습니다.

tar cO CONTENTS/ | shasum
tar: Option -O is not permitted in mode -c
da39a3ee5e6b4b0d3255bfef95601890afd80709  -

시도 2: FIND/EXEC 사용

MacOS와 FreeBSD 간에는 일관성이 있었지만 Linux는 이상한 해시를 반환했습니다.

find CONTENTS -type f -exec shasum {} \; | sort -k 2 | shasum

리눅스

c2ddb9bc5f543e956f5cdcc76750cb78cc5f26f3

FreeBSD

3ac2a9d4e2fc5d2d2ec3c7f612e680990cc35824

맥 OS

3ac2a9d4e2fc5d2d2ec3c7f612e680990cc35824

TAR에 대한 기타 조사 결과

tar폴더를 "보관"하고 그렇게 할 수 있으므로 훌륭할 것입니다 . 그러나 폴더 구조를 "보관" shasum하는 순서는 다음과 같습니다.tar운영 체제 전반에 걸쳐 일관성이 없음. 의견에서 일부 도우미가 언급했듯이 tar모든 시스템에서 동일한 버전을 사용해야 합니다.

예를 들어, 시스템 1에는 다음 순서가 있습니다.

drwxr-xr-x  0 root   wheel       0 27 Jul 07:23 usr/
-rw-r--r--  0 root   wheel       0 27 Jul 07:25 usr/aaa
drwxr-xr-x  0 root   wheel       0 27 Jul 07:25 usr/f1/
-rw-r--r--  0 root   wheel       0 27 Jul 07:25 usr/f1/aaa
drwxr-xr-x  0 root   wheel       0 27 Jul 07:25 usr/f1/f0/
-rw-r--r--  0 root   wheel       0 27 Jul 07:25 usr/f1/f0/aaa
drwxr-xr-x  0 root   wheel       0 27 Jul 07:25 usr/f2/
-rw-r--r--  0 root   wheel       0 27 Jul 07:25 usr/f2/aaa
drwxr-xr-x  0 root   wheel       0 27 Jul 07:25 usr/f2/f1/
-rw-r--r--  0 root   wheel       0 27 Jul 07:25 usr/f2/f1/aaa
drwxr-xr-x  0 root   wheel       0 27 Jul 07:25 usr/f2/f1/f0/
-rw-r--r--  0 root   wheel       0 27 Jul 07:25 usr/f2/f1/f0/aaa
drwxr-xr-x  0 root   wheel       0 27 Jul 07:25 usr/f3/
-rw-r--r--  0 root   wheel       0 27 Jul 07:25 usr/f3/aaa
drwxr-xr-x  0 root   wheel       0 27 Jul 07:25 usr/f3/f2/
-rw-r--r--  0 root   wheel       0 27 Jul 07:25 usr/f3/f2/aaa
drwxr-xr-x  0 root   wheel       0 27 Jul 07:25 usr/f3/f2/f1/
-rw-r--r--  0 root   wheel       0 27 Jul 07:25 usr/f3/f2/f1/aaa

시스템 2에서는 다음 순서를 따릅니다.

drwxr-xr-x  0 root   wheel       0 27 Jul 07:23 usr/
-rw-r--r--  0 root   wheel       0 27 Jul 07:25 usr/aaa
drwxr-xr-x  0 root   wheel       0 27 Jul 07:25 usr/f1/
drwxr-xr-x  0 root   wheel       0 27 Jul 07:25 usr/f2/
drwxr-xr-x  0 root   wheel       0 27 Jul 07:25 usr/f3/
-rw-r--r--  0 root   wheel       0 27 Jul 07:25 usr/f3/aaa
drwxr-xr-x  0 root   wheel       0 27 Jul 07:25 usr/f3/f2/
-rw-r--r--  0 root   wheel       0 27 Jul 07:25 usr/f3/f2/aaa
drwxr-xr-x  0 root   wheel       0 27 Jul 07:25 usr/f3/f2/f1/
-rw-r--r--  0 root   wheel       0 27 Jul 07:25 usr/f3/f2/f1/aaa
-rw-r--r--  0 root   wheel       0 27 Jul 07:25 usr/f2/aaa
drwxr-xr-x  0 root   wheel       0 27 Jul 07:25 usr/f2/f1/
-rw-r--r--  0 root   wheel       0 27 Jul 07:25 usr/f2/f1/aaa
drwxr-xr-x  0 root   wheel       0 27 Jul 07:25 usr/f2/f1/f0/
-rw-r--r--  0 root   wheel       0 27 Jul 07:25 usr/f2/f1/f0/aaa
-rw-r--r--  0 root   wheel       0 27 Jul 07:25 usr/f1/aaa
drwxr-xr-x  0 root   wheel       0 27 Jul 07:25 usr/f1/f0/
-rw-r--r--  0 root   wheel       0 27 Jul 07:25 usr/f1/f0/aaa

관점 에서는 tar모두 괜찮지만 순서로 인해 shasum다른 해시가 생성됩니다.

결론

shasum개별 파일 해시를 확인하기 위해 Linux와 BSD 사이에서 일관성이 있지만 디렉터리의 경우 파일 정렬 방식으로 인해 MacOS와 FreeBSD에서만 일관성이 발생합니다.

명령 을 사용하여 정렬을 적용하면 findFreeBSD 및 MacOS에서만 일관성을 얻을 수 있습니다. 그러나 이 방법은 모든 단일 파일에 대한 해시를 계산한 다음 전체 구조 해시를 계산하는 데 상당한 시간이 걸리기 때문에 시간이 많이 걸립니다.

를 사용하여 tar임시 파일을 생성한 다음 수행하는 것도 shasumLinux와 BSD 간에 일치하지 않는 것으로 나타났습니다. 아마도 보관 방법의 차이 때문일 것입니다.

내 생각에 앞으로 나아갈 수 있는 유일한 방법은내 솔루션을 다시 디자인.

답변1

mtree당신이 원하는 도구입니다.

가정하다:

$ mkdir foo
$ date > foo/date1; sleep 3
$ date > foo/date2; sleep 3
$ date > foo/date3
$ grep . foo/*
foo/date1:Wed Jul 24 16:11:32 PDT 2019
foo/date2:Wed Jul 24 16:11:35 PDT 2019
foo/date3:Wed Jul 24 16:11:38 PDT 2019
$ find . -ls
7318841   0 drwxr-xr-x    3 admin    staff     102 Jul 24 16:11 .
7318847   0 drwxr-xr-x    5 admin    staff     170 Jul 24 16:11 ./foo
7318849   8 -rw-r--r--    1 admin    staff      29 Jul 24 16:11 ./foo/date1
7318851   8 -rw-r--r--    1 admin    staff      29 Jul 24 16:11 ./foo/date2
7318853   8 -rw-r--r--    1 admin    staff      29 Jul 24 16:11 ./foo/date3

디렉토리의 참조 매니페스트를 생성 foo하고 다음 위치에 저장합니다 foo.mtree.

$ mtree -c -K sha256digest -p foo > foo.mtree

이제 해당 디렉토리에 있는 아무 파일이나 수정해 보세요.

$ touch foo/date3

다시 실행 mtree하고 이전에 생성한 매니페스트를 전달하면 mtree변경된 내용을 알려줍니다.

$ mtree -p foo < foo.mtree || echo fail
date3 changed
        modification time expected Wed Jul 24 16:11:38 2019 found Wed Jul 24 16:14:00 2019
fail

$ echo '$ date > foo/date2' >> bar
$ mtree -p foo < foo.mtree || echo fail
date2 changed
        modification time expected Wed Jul 24 16:11:35 2019 found Wed Jul 24 16:19:40 2019
        SHA-256 expected c76a568f08d98c2830f2fdfb42415c3ec15341b8741450d4bbd863f1d5c4c691 found ddcf8d07785bfe4d031a989339835dc3b8b44653019568dcee612c44fc8e2f70
date3 changed
        modification time expected Wed Jul 24 16:11:38 2019 found Wed Jul 24 16:14:00 2019
fail

매니페스트가 생성된 이후 누락되거나 추가된 모든 파일 foo도 보고됩니다.

$ mv foo/date1 foo/date4
$ mtree -p foo < foo.mtree || echo fail
. changed
        modification time expected Wed Jul 24 16:11:38 2019 found Wed Jul 24 16:21:38 2019
date2 changed
        modification time expected Wed Jul 24 16:11:35 2019 found Wed Jul 24 16:19:40 2019
        SHA-256 expected c76a568f08d98c2830f2fdfb42415c3ec15341b8741450d4bbd863f1d5c4c691 found ddcf8d07785bfe4d031a989339835dc3b8b44653019568dcee612c44fc8e2f70
date3 changed
        modification time expected Wed Jul 24 16:11:38 2019 found Wed Jul 24 16:14:00 2019
date4 extra
./date1 missing
fail

답변2

Rmlint(제 생각에는) 당신이 원하는 대로 할 것입니다.

관련 사항:

  • 기본적으로 SHA를 사용하지 않지만 지시를 받을 수 있습니다.
  • Homebrew를 통해 MacOS에 설치할 수 있습니다.
  • 기본적으로 지정된 단일 디렉터리에 대한 체크섬은 계산되지 않습니다. 해당 지점 아래의 "중복" 디렉터리를 찾는 방법으로 지정된 시작 지점에서 모든 디렉터리에 대한 체크섬을 계산하도록 지시할 수 있습니다. 그러나 부작용으로 당신이 요구하는 것처럼 보이는 것을 정확하게 수행할 것입니다.
  • 찾고 있는 내용에 비해 과잉일 수 있으며 사용할 최상의 옵션 플래그를 찾는 데 시간이 걸릴 수 있지만 매우 강력합니다.
  • 어떤 플래그를 사용할지 파악하는 것은 까다로울 수 있습니다. 디렉토리 체크섬을 얻는 것은 충분히 쉽지만~ 아니다다른 일을 하면 까다로울 수 있습니다. (명확하게 말하면 실제로 아무것도 수정하지 않습니다. 기껏해야 나중에 수동으로 실행하여 원하는 경우 수정할 수 있는 쉘 스크립트를 생성합니다. 필요한 것은 JSON 및/또는 CSV 출력입니다. 찾고 있는 디렉터리 체크섬을 제공하는 파일입니다.)

bash 스크립트에서 rmlint를 사용하여 중복 디렉터리를 찾습니다. 다음은 원하는 작업을 최소한으로 수행하고 그 외에는 가능한 한 적은 작업을 수행하는 명령입니다.

rmlint "base/dir/to/start/from" --see-symlinks --hidden --algorithm=sha256 --types=none,duplicatedirs --no-backup -o csv:log.csv

관련 정보