두 폴더/디스크의 내용 비교(타임스탬프, 권한 포함)

두 폴더/디스크의 내용 비교(타임스탬프, 권한 포함)

두 개의 서로 다른 하드 드라이브에 두 개의 디렉토리가 있고 내용이 진짜인지 확인하고 싶습니다.정확히같은. 내가 읽은 내용에 따르면 이를 사용하여 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

그렇지 않으면 mtree0이 아닌 종료 코드가 반환되어 다양한 항목을 항목별로 표시합니다.

# 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되지 않는 추가 항목이 있습니다 .hostBhostA
  • 항목 수정 시간은 두 호스트 간에 다릅니다 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

관련 정보