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에서만 일관성이 발생합니다.
명령 을 사용하여 정렬을 적용하면 find
FreeBSD 및 MacOS에서만 일관성을 얻을 수 있습니다. 그러나 이 방법은 모든 단일 파일에 대한 해시를 계산한 다음 전체 구조 해시를 계산하는 데 상당한 시간이 걸리기 때문에 시간이 많이 걸립니다.
를 사용하여 tar
임시 파일을 생성한 다음 수행하는 것도 shasum
Linux와 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