두 개의 서로 다른 하드 드라이브에 두 개의 디렉토리가 있고 내용이 진짜인지 확인하고 싶습니다.정확히같은. 내가 읽은 내용에 따르면 이를 사용하여 diff -rq dir1 dir2
파일이 누락되었거나 다른지 확인할 수 있습니다.
-q
,--brief
파일이 다른 경우에만 보고
-r
,--recursive
발견된 하위 디렉터리를 재귀적으로 비교
그러나 내가 아는 한 diff는 권한이나 타임스탬프가 다른지 확인하지 않습니다. 차이점을 확인할 수 있는 다른 매개변수나 다른 도구가 있나요?
답변1
mtree(8)
훌륭한 도구입니다.
주문하다:
$ mtree -cp path/on/hostA -K sha256 | ssh hostB mtree -p path/on/hostB
계층 구조 hostA:path/on/hostA
와 계층 구조 간의 hostB:path/on/hostB
유형, 크기, 타임스탬프, 권한 및 콘텐츠의 차이 가 보고됩니다. 또한 누락된 항목( 에서는 찾을 수 없음 hostB
) 또는 관련 없는 항목(에서만 찾을 수 있음)이 보고됩니다.hostB
상속이 동일하면 mtree
출력이 내보내지지 않고 종료 코드 0이 반환됩니다.
$ mtree -cp path/on/hostA -K sha256 | ssh hostB mtree -p path/on/hostB && echo match
match
그렇지 않으면 mtree
0이 아닌 종료 코드가 반환되어 다양한 항목을 항목별로 표시합니다.
# create some differences on hostB:
$ ssh hostB 'rmdir path/on/hostB/d'
$ ssh hostB 'mkdir path/on/hostB/e'
$ ssh hostB 'date > path/on/hostB/b/B'
$ ssh hostB 'touch path/on/hostB/b/BB'
$ ssh hostB 'chmod 644 path/on/hostB/c/C'
# and then compare:
$ mtree -cp path/on/hostA -K sha256 | ssh hostB mtree -p path/on/hostB || echo fail
.: modification time (Tue May 18 13:27:20 2021, Tue May 18 13:45:06 2021)
extra: e
b/BB: modification time (Tue May 18 13:27:28 2021, Tue May 18 13:50:01 2021)
b/B: modification time (Tue May 18 13:27:03 2021, Tue May 18 13:46:04 2021)
sha256 (0x4f7986b5a925296c575043e73e76b59b6eb84da37c50f2e86baaafc75e2fcdca, 0x46f3f4e748cfef2a4cd679d6c9723cb44eb0526b760854fcef33bb97ca27fae2)
c/C: permissions (0600, 0644)
missing: ./d
fail
한 줄씩 알려 드리겠습니다 mtree
.
- 경로 루트 자체(
.
)의 타임스탬프가 다릅니다. - 에 표시
e
되지 않는 추가 항목이 있습니다 .hostB
hostA
- 항목 수정 시간은 두 호스트 간에 다릅니다
b/BB
(그러나 내용은 그렇지 않음). - 수정 시간 및 항목 내용(해시) 이 두 호스트 간에
SHA256
다릅니다.b/B
c/C
두 호스트는 서로 다른 액세스 권한을 갖습니다.hostB
누락된 항목./d
답변2
AFAIK diff
혼자서는 할 수 없지만 프로세스 교체를 지원하는 셸(예: bash/zsh)을 사용하는 경우 state
명령을 다음과 같은 diff로 병합 할 수 있습니다.
#working example:
echo "some file" > foo
cp foo bar
diff <(stat foo) <(stat bar)
chmod o+x bar
diff <(stat foo) <(stat bar)
노트이 프로세스 교체는 POSIX와 호환되지 않으므로 이식성이 더 높은 것이 필요한 경우 스크립트를 직접 작성해야 합니다. 위 diff
명령은 대략 다음과 같이 POSIX로 변환될 수 있습니다.
mkfifo /var/tmp/fifo1
mkfifo /var/tmp/fifo2
stat foo >/var/tmp/fifo1 &
stat bar >/var/tmp/fifo2 &
diff /var/tmp/fifo1 /var/tmp/fifo2
rm /var/tmp/fifo1 /var/tmp/fifo2