假设我们有一个文件/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
肯定是很好的初步测试。