The*_*One 48 command-line find centos files
我发现这个命令用于查找重复的文件,但它很长,让我感到困惑。例如,如果我删除 -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
Run Code Online (Sandbox Code Playgroud)
hee*_*ayl 66
你可以缩短它:
find . ! -empty -type f -exec md5sum {} + | sort | uniq -w32 -dD
Run Code Online (Sandbox Code Playgroud)
Do md5sumof found files on the -execaction of findthen sortand douniq得到相同的文件,md5sum用换行符分隔。
MvG*_*MvG 25
如果您想了解原始命令,让我们一步一步来。
find -not -empty -type f
Run Code Online (Sandbox Code Playgroud)
查找当前目录或其任何子目录中的所有非空文件。
-printf "%s\n"
Run Code Online (Sandbox Code Playgroud)
打印其大小。如果删除这些参数,它将改为打印路径,从而中断后续步骤。
| sort -rn
Run Code Online (Sandbox Code Playgroud)
按数字 ( -n)排序,逆序 ( -r)。不过,按升序排序并作为字符串而不是数字进行比较也应该同样有效,因此您可以删除-rn标志。
| uniq -d
Run Code Online (Sandbox Code Playgroud)
寻找重复的连续行并只保留那些。
| xargs -I{} -n1
Run Code Online (Sandbox Code Playgroud)
对于输入的每一行(即每个大小出现多次),执行以下命令,但替换{}为大小。对每一行输入执行一次命令,而不是将多个输入传递给单个调用。
find -type f -size {}c -print0
Run Code Online (Sandbox Code Playgroud)
这是针对每个大小运行的命令:在当前目录中查找匹配该大小的文件,以字符 ( c) 或更精确的字节给出。打印所有匹配的文件名,用空字节而不是换行符分隔,以便正确处理包含换行符的文件名。
| xargs -0 md5sum
Run Code Online (Sandbox Code Playgroud)
对于这些空分隔名称中的每一个,计算所述文件的 MD5 校验和。这次我们允许将多个文件传递给md5sum.
| sort
Run Code Online (Sandbox Code Playgroud)
按校验和排序,因为uniq只考虑连续的行。
| uniq -w32 --all-repeated=separate
Run Code Online (Sandbox Code Playgroud)
查找前 32 个字节(校验和;之后是文件名)一致的行。打印这些重复运行的所有成员,不同的运行由换行符分隔。
与heemayl 建议的更简单的命令相比,这样做的好处是它只会校验和文件具有相同大小的另一个文件。它通过重复find调用来支付,从而多次遍历目录树。由于这些原因,此命令特别适合文件很少但文件很大的目录,因为在这些情况下,避免校验和调用可能比避免重复遍历树更重要。