当前位置: 首页 > 科技观察

使用Linux查找重复文件

时间:2023-03-15 01:36:05 科技观察

方法一:使用Find命令本部分讲解如何使用find的强大功能。在find的基础上,我们可以将它与其他基本的Linux命令(比如xargs命令)结合起来,创造无限的命令行功能,例如:可以快速找出某个Linux文件夹及其子文件夹中的文件重复文件列表.实现这个功能,过程比较简单,只需要搜索遍历所有的文件,然后用命令比较每个文件的MD5就OK了。听起来很抽象,其实只有一个命令:find-not-empty-typef-printf"%s\n"|sort-rn|uniq-d|xargs-I{}-n1find-typef-size{}c-print0|xargs-0md5sum|sort|uniq-w32--all-repeated=separatefind-not-empty-typef-printf"%sn"表示使用find命令搜索所有非空文件,然后打印出它们的大小sort-rn命令不用多说,这个命令就是按文件大小反向排序uniq-d|xargs-I{}-n1find-typef-size{}c-print0表示只打印重复的行,这里的使用表示打印出同名文件uniq-w32–all-repeated=separate最后,意思是比较MD5的前32个字节,过滤掉重复的文件。使用命令行的整个过程是如此简单易行。方法二:使用dupeGuru工具DupeGuru是一个跨平台的应用程序,有Linux、Windows和MacOSX版本。它可以帮助用户通过文件大小、MD5和文件名等各种标准在Linux中查找重复文件。Ubuntu用户可以直接添加以下PPA源安装:sudoadd-apt-repositoryppa:hsoft/ppasudoapt-getupdatesudoapt-getinstalldupeguru*方法三:使用Find命令分析在我们的工作和生活中,很可能会遇到重复文件的问题.例如,从某游戏中提取了重复的游戏文本。我们希望找出所有的重复文本,让译者只翻译其中的一个,其他的直接替换掉。那么这个问题该怎么办呢?当然,方法是多种多样的,无论采用哪种方法,应该都不会太难,但是笔者第一次遇到这个问题时,第一反应是使用Linuxshell脚本,所以本文介绍了这个方法。代码优先:find-not-empty-typef-printf"%sn"|sort-rn|uniq-d|xargs-I{}-n1find-typef-size{}c-print0|xargs-0md5sum|sort|uniq-w32--all-repeated=separate|cut-b36-Everyone先cd到你要查找重复文件的文件夹,然后复制上面的代码,系统会检查当前文件夹和子文件夹下的所有文件做一个权重查看。我们来分析一下上面的命令。先看第一句:find-not-empty-typef-printf"%sn"find是一个搜索命令;-not-empty就是找一个非空的文件;-typef是找一个正规文件;-printf"%sn"这很混乱。这里的%s不是C语言中的输出字符串。它实际上代表文件的大小,单位是bytes(不懂就man,自己man找),n是换行符。那么这句话的意思就是输出所有非空文件的大小。通过管道将上面的结果传递给第二句:sort-rnsort是排序,-n表示按大小排序,-r表示从大到小排序(倒序reverse)。第三句:uniq-duniq是只输出重复的部分一次,-d的意思是只输出重复的部分(如果9出现5次,则输出19,而2只出现1次,不是重复的数,所以它不是输出)。第四句:xargs-I{}-n1find-typef-size{}c-print0这部分分为两部分,第一部分是xargs-I{}-n1,xargs命令将前面的结果转换成参数用于后面的find调用,其中-I{}表示把参数写成{},-n1表示将前面的结果一个一个输入到下一个命令(-n8表示8个8输入到下一句,不要写-n就是把前面的结果交给下一句)。后半部分是find-typef-size{}c-print0,我们之前看到的find命令,-size{}是指查找大小为{}bytes的文件,-print0是为了防止文件名有空格并写入参数。第五句:xargs-0md5sumxargs我们之前说过,它把前面的结果转化为输入,那么这个-0是什么意思呢?man一下xargs,我们看到-0表示读取参数时用null作为分隔符,这个不难理解,毕竟null的二进制表示是00。下面的md5sum指的是计算输入的md5值。第六句:sort就是排序,这个我们之前已经看到了。第七句:uniq-w32--all-repeated=separateuniq-w32指的是寻找前32个字符相同的行,因为md5值必须是32位,后面的--all-repeated=separate是指将重复的部分归为一类,对输出进行分类。第八句:cut-b36-由于我们的结果有md5值,不太好看,所以我们截取md5值后面的部分,cut是文本处理函数,这里的-b36-表示只要有每行部分有36个字符。我们将上述每个命令与管道链接起来,并将它们存储在result.txt中:find-not-empty-typef-printf"%sn"|sort-rn|uniq-d|xargs-I{}-n1find-typef-size{}c-print0|xargs-0md5sum|sort|uniq-w32--all-repeated=separate|cut-b36->result.txt虽然结果看起来不错,但是有个问题,在Linux下看起来不错,实际如果有朋友把输出文件放到Windows上,你会发现换行符没有了。这是因为linux下的换行符是n,而windows要求的是nr。为了解决这个问题,我们最后执行一个将n转换成nr的命令:catresult.txt|cut-c36-|tr-s'n'