![比较有关文件名(以及大小和日期)的目录树](https://linux22.com/image/34457/%E6%AF%94%E8%BE%83%E6%9C%89%E5%85%B3%E6%96%87%E4%BB%B6%E5%90%8D%EF%BC%88%E4%BB%A5%E5%8F%8A%E5%A4%A7%E5%B0%8F%E5%92%8C%E6%97%A5%E6%9C%9F%EF%BC%89%E7%9A%84%E7%9B%AE%E5%BD%95%E6%A0%91.png)
我想检查从备份恢复的结果。这是因为 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
来列出所有相等的内容。
告诉--delete
rsync 模拟删除源中不存在的目标文件。如果没有该-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/file1
和dirB/file1
具有不同的内容。这种格式与您所期望的一样简单,并且即使对于大型目录也相当快。