我不小心删除了部分文件夹(在停止 rm 命令之前)。但是,我恢复的备份大约是 2 周前的,不幸的是,我在删除目录和备份时间点之间对目录进行了重命名和重组。我已经手动恢复了我所知道丢失的内容,但我不确定我是否设法捕捉到了所有内容。
是否有一种快速显示不包括其父目录、仅包括文件名和修改或创建日期的文件差异的方法?例如,我有目录
data/output/test1/file1.mha
我可能已经移动/重命名为
data/results/mhas/first_test/file1.mha
使用diff -rq
对此不起作用,而且速度也很慢。该目录有大约 2TB 的大小和相当多的文件,因此几乎无法检查每个文件的 MD5。
澄清一点,恢复备份后,我有:
/data_backup_restore/output/test1/file1.mha
和
/data/results/mhas/first_test/file1.mha
因为恢复的备份仍然使用“旧”目录结构。我已经更改了它,因为它一团糟,但我没有写下我所做的所有更改/重命名,因为它们有很多。
如果文件大小、修改日期和文件名匹配,我会认为以上两者相同。
如果我理解正确你想递归地比较两个目录,但忽略目录结构,所以基本上如果你在两棵树中找到两个文件具有相同的文件名,创建/修改时间和大小(你没有提到大小,但是我猜它也会有用),然后将它们视为相同的,即使它们在两个目录树中处于不同的位置。
如果这是正确的,您可以创建一个包含大小、时间和文件名的文件列表,如下所示:
然后比较这两个列表,或者使用
diff
GUI 或者像meld
.细节:
--time-style=long-iso
避免可能破坏以下管道的特定于语言环境的特性。grep ^-
只选择实际文件,忽略目录和可能的其他特殊文件。根据您的用例,您可能想在此处添加更多内容,例如符号链接...tr -s ' '
将挤压多个连续的空间,以便以下cut
在所有情况下都能正常工作。cut
从第 5 列开始的列(文件大小)sort
以便稍后进行比较。-k 4
并不是真的有必要,只要您在这两个命令中保持一致即可。-k 4
将按可能有用的文件名排序。比较两个文件并找到差异后,您当然必须在原始目录树中找到该文件,您可以使用
find
它。更新
根据您的意见,如果您想找到多次出现的文件名的完整路径,您可以执行以下操作:
首先获取第二个目录中丢失的文件列表,例如:
然后,对于每个丢失的文件,使用 find 查找特定文件的完整路径:
现在请注意,这只是一个简单的示例而不是最佳示例,并且根据丢失文件的数量,它会
find
多次调用,如果目录如您指示的那样大,这可能会很慢。在这种情况下,您应该尝试以某种方式对其进行优化(例如,列出所有类似于ls -lR
但包含完整路径的文件,并尝试将该列表与您在文件中找到的列表相匹配missing.txt
)。要比较文件内容,您可以使用以下命令:
您可以将这两个文件排序在一起。由于前两个字段是校验和和大小,您可以忽略具有相同校验和和大小的两个组。一个一组表示一个文件夹中缺少文件。
来源: 递归比较大目录 - 但忽略子目录 - 比较两个备份 - 使用 gui。
一种可能的方法是使用哈希:
奇怪的构造
**/*
是在子目录中搜索(globbing
应该启用),这将在第一个目录中生成文件的哈希值,并使用第二个目录中的哈希值检查它,并指示有关 OK 文件和丢失/不匹配的哈希值:PS 不要害怕使用哈希函数,它们非常快