我在两个不同的硬盘上有两个目录,想检查内容是否真的确切地相同。根据我读到的内容,我可以用来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