我发现这个命令用于查找重复的文件,但它很长,让我很困惑。
例如,如果我删除-printf "%s\n"
,则什么也没有出现。为什么会这样?此外,他们为什么使用xargs -I{} -n1
?
有没有更简单的方法来查找重复的文件?
[4a-o07-d1:root/798]#find -not -empty -type f -printf "%s\n" | sort -rn | uniq -d | xargs -I{} -n1 find -type f -size {}c -print0 | xargs -0 md5sum | sort | uniq -w32 --all-repeated=separate
0bee89b07a248e27c83fc3d5951213c1 ./test1.txt
0bee89b07a248e27c83fc3d5951213c1 ./test2.txt
答案1
您可以将其缩短:
find . ! -empty -type f -exec md5sum {} + | sort | uniq -w32 -dD
md5sum
对找到的文件进行-exec
操作,find
然后sort
执行操作以获取具有相同内容并以换行符分隔的uniq
文件。md5sum
答案2
答案3
如果您想了解原始命令,让我们一步一步地进行。
find -not -empty -type f
查找当前目录或其任何子目录中的所有非空文件。
-printf "%s\n"
打印其尺寸。如果您删除这些参数,它将改为打印路径,从而破坏后续步骤。
| sort -rn
按数字排序 ( -n
),按相反顺序排序 ( -r
)。不过,按升序排序并作为字符串而不是数字进行比较应该同样有效,因此您可以删除标志-rn
。
| uniq -d
查找重复的连续行并仅保留这些行。
| xargs -I{} -n1
对于输入的每一行(即出现多次的每个尺寸),执行以下命令,但替换{}
为尺寸。对每行输入执行一次命令,而不是将多个输入传递给单个调用。
find -type f -size {}c -print0
这是针对每个大小运行的命令:在当前目录中查找与该大小匹配的文件,以字符 ( c
) 或更精确的字节给出。打印所有匹配的文件名,用空字节而不是换行符分隔,以便正确处理包含换行符的文件名。
| xargs -0 md5sum
对于每个以 null 分隔的名称,计算所述文件的 MD5 校验和。这次我们允许将多个文件传递给md5sum
.
| sort
按校验和排序,因为uniq
只考虑连续行。
| uniq -w32 --all-repeated=separate
查找前 32 个字节(校验和;之后是文件名)一致的行。打印此类重复项的所有成员,并用换行符分隔不同的运行。
相比heemayl 建议的更简单的命令,这样做的好处是它只会校验具有相同大小的另一个文件的文件。它通过重复调用来弥补这一点find
,从而多次遍历目录树。由于这些原因,此命令特别适合文件很少但很大的目录,因为在这些情况下,避免校验和调用可能比避免重复的树遍历更重要。