Linux:在目录中查找所有重复文件的快速方法是什么?



我有一个包含许多子目录和大约7000多个文件的目录。我需要的是找到所有文件的副本。对于任何给定的文件,它的副本可能分散在不同的子目录中,文件名可能相同,也可能不相同。副本是指您从diff命令获得0返回码的文件。

最简单的方法是对目录树中的所有文件运行一个双循环。但这是7000^2的顺序差异,效率不高:

for f in `find /path/to/root/folder -type f`
do
for g in `find /path/to/root/folder -type f`
do
if [ "$f" = "$g" ]
then
continue
fi
diff "$f" "$g" > /dev/null
if [ $? -eq 0 ]
then
echo "$f" MATCHES "$g"
fi
done
done

有更有效的方法吗?

在Debian 11上:

% mkdir files; (cd files; echo "one" > 1; echo "two" > 2a; cp 2a 2b)
% find files/ -type f -print0 | xargs -0 md5sum | tee listing.txt | 
awk '{print $1}' | sort | uniq -c | awk '$1>1 {print $2}' > dups.txt
% grep -f dups.txt listing.txt
c193497a1a06b2c72230e6146ff47080  files/2a
c193497a1a06b2c72230e6146ff47080  files/2b
  • 查找并打印所有以null结尾的文件(-print0)。
  • 使用xargsmd5sum它们
  • 在列表"listing.txt"中保存一个总数和文件名的副本。文件。
  • 获取总和并传递给sort然后uniq -c进行计数,保存到"dup .txt"文件。
  • 使用awk列出重复项,然后使用grep查找和文件名。

相关内容

  • 没有找到相关文章

最新更新