比较两个文件夹/磁盘的内容(包括时间戳、权限)

比较两个文件夹/磁盘的内容(包括时间戳、权限)

我在两个不同的硬盘上有两个目录,想检查内容是否真的确切地相同。根据我读到的内容,我可以用来diff -rq dir1 dir2检查文件是否丢失或不同。

-q--brief
仅在文件不同时报告

-r--recursive
递归比较找到的任何子目录

但是据我所知 diff 不会检查权限或时间戳是否不同。 diff 或其他工具是否还有另一个参数可以检查它?

答案1

mtree(8)是一个很好的工具:

命令:

$ mtree -cp path/on/hostA -K sha256 | ssh hostB mtree -p path/on/hostB

将报告层次结构 inhostA:path/on/hostA和层次结构 in 之间在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将返回非零退出代码,并逐项列出不同的条目:

# 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

AFAIKdiff单独无法做到这一点,但是如果您使用支持进程替换的 shell(如 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

相关内容