在 bash 中,如何在特定目录中找到给定文件的所有副本?

在 bash 中,如何在特定目录中找到给定文件的所有副本?

假设我们有一个文件/a_long_path_1/foo.doc,大小为 12345 字节,我们想递归地查找目录/a_long_path_2/a_long_path_3及其所有子目录中此文件的所有副本。副本名称的主要部分可能与不同foo(尽管扩展名.doc可能保持不变),创建/修改日期可能不同,但foo其副本中的内容应该相同。

如果我发出find /a_long_path_2 /a_long_path_3 -size 12345c -iname \*.doc,我得到的列表太大,无法通过 手动检查diff。需要自动化。可能使自动化变得困难的其他信息:此find …命令输出中的某些目录名称包含空格。

明确地说:我愿意不是希望找到文件系统上所有文件的所有重复项(但只找到一个特定文件的所有重复项),甚至不需要中间步骤。(无论如何,这样的列表都会很长。)

答案1

如果我发布find /a_long_path_2 /a_long_path_3 -size 12345c -iname \*.doc,我获得的列表太大,无法通过手动检查diff。需要自动化。

添加-exec cmp -s /a_long_path_1/foo.doc {} \; -print

find /a_long_path_2 /a_long_path_3 \
   -type f \
   -size 12345c \
   -iname \*.doc \
   -exec cmp -s /a_long_path_1/foo.doc {} \; \
   -print

这是因为find -exec也是一个测试,当且仅当调用的工具返回退出状态 0,它才成功。cmp -s当且仅当两个给定的文件相同,则静默返回退出状态 0。

-iname \*.doc可以加快速度,但总的来说,它可能会让你错过一些重复项。-type f并且-size 12345c肯定是很好的初步测试。

相关内容