Shell's Home

Jan 15, 2007 - 1 minute read - Comments

查找重复文件

算是介绍一个奇淫巧技吧。查找重复的文件,这个应该有很多软件都可以做的。不过在Linux里面,利用系统工具,一句语句查找应该就比较少见了。

$find . -name "*" -type f -size +0 -exec md5sum {} ; | sort | uniq -d -w 32

原理是这样的,先用find查找当前所有文件。我们加上限定类型必须是文件,目录不要。限定大小不为0,空文件不要。然后对所有满足条件的执行md5sum,获得md5和文件的列表。然后排序,再针对md5的部分做唯一限定。就得到了所有md5相同的文件的列表。

问题是,这时候我们得到的还只是一堆重复的文件的md5。我们可以把以上步骤拆开来获得完整的输出。

$find . -name "*" -type f -size +0 -exec md5sum {} ; | sort > file_md5
$cat file_md5 | uniq -d -w 32
$grep "..." file_md5

相信大家都看出是怎么回事情了,就不赘言了。

Windows下以前我总是执行不出,原因在于要这么写。

find . -type f -size +0 -exec md5sum {} ; | sort > report.txt

差一个转义,因为不需要。

总结一下,我们可以用一个脚本来处理这些问题。

--------------------------fine_rep------------------------------

find $1 -type f -size +0 -exec md5sum {} ; | sort > "file_md5"
cat "file_md5" | uniq -d -w 32 | cut -d" " -f1 | while read x
do
    grep "$x" file_md5
    echo ""
done
echo "done"
rm "file_md5"

------------------------------------------------------------

Tags: bash linux

构造过程 KMP

comments powered by Disqus