比较有关文件名(以及大小和日期)的目录树

比较有关文件名(以及大小和日期)的目录树

我想检查从备份恢复的结果。这是因为 MacOS 上的 TimeMachine 给了我一些奇怪的错误和警告,我想确保恢复后一切都恢复原位。虽然我不相信 TimeMachine 会恢复每个文件,但我相信它会使用正确的内容恢复恢复的每个文件。

我考虑过 diff -r,但大约 300 GiB 可能需要很长时间。我可以至少比较文件的存在情况,但在同一运行中比较大小和日期甚至更好。

我知道像这样的解决方案

diff <(ls -R $PATH1) <(ls -R $PATH2)

但输出很难阅读。我宁愿每个文件只在一侧找到一行。另外,我必须依靠 ls 在两侧以相同的顺序遍历树。这可能会有所不同,因为文件系统可能有所不同。

我最希望得到一个适合懒人的工具,它需要两条路径并输出差异到任何所需的检查级别,也许是 macports 之外的东西。但我并不担心受到足够多的攻击。

答案1

这是您的解决方案:

rsync -nrv --delete dirA/ dirB/

我们没有使两个文件夹相同,而是使用 rsync 来仅显示它的内容做。这就是 的效果-n。小心,不要忘记添加这个选项!

-r意味着递归扫描,-v给出了想要的详细列表。您也可以添加另一个-v来列出所有相等的内容。

告诉--deletersync 模拟删除源中不存在的目标文件。如果没有该-n标志,该dirB文件夹将变得与dirA.

默认情况下,rsync 仅检查文件的名称和时间戳,这正是您所要求的快速选项。如果您想要类似 diff 行为的行为(并且同样慢),您可以添加一个-c标志来强制校验和比较。

rsync -nrvc --delete dirA/ dirB/

dirA/请注意和中尾部斜杠的用法dirB/,它们在 中很重要rsync。有关更多信息,请研究rsync手册页,习惯这个强大的命令非常有意义。

答案2

您提到的“解决方案”是一个非常糟糕的解决方案(例如,它无法处理奇怪的文件名)并且完全没有必要。直接使用即可diff

diff -r "$PATH1" "$PATH2"

这将递归地 ( -r) 比较目录并报告文件是否存在或丢失。例如:

$ tree
.
├── dirA
│   ├── file1
│   └── file2
└── dirB
    └── file{1}

$ diff -qr dirA dirB
Files dirA/file1 and dirB/file1 differ
Only in dirA: file2
Only in dirB: file3

-q选项的意思是“安静”,它只会报告文件是否不同,而不打印差异。在上面的示例中,文件dirA/file1dirB/file1具有不同的内容。这种格式与您所期望的一样简单,并且即使对于大型目录也相当快。

相关内容