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

11 linux debian bash deduplication find

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

\n

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

\n

需要明确的是:我不希望找到文件系统上所有文件的所有重复项(而是仅找到一个特定文件的所有重复项),甚至不希望作为中间步骤。(无论如何,这样的列表会很大。)

\n

Kam*_*ski 14

如果我发出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
Run Code Online (Sandbox Code Playgroud)

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

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

  • @Tom:更具体一点:“find”将用一个或多个文件名替换“{}”(如果“-exec”命令以“;”结尾则恰好是一个,如果以“+”结尾则可能是多个,之后从外壳中逃脱)。这里的“find”命令将对每个大小为 12345c、以“doc”结尾(不区分大小写)的文件执行一次“cmp”。比较“查找”。-type f -exec md5sum {} +` 将会对多个文件执行一次“md5sum”(例如“md5sum a.txt b.doc c.jpg”)。方便的是,“find”可以正确处理文件名中的各种特殊字符,因此您不必这样做。 (3认同)
  • @tom find 将其替换为当前文件名。 (2认同)