您的位置:首页 > 运维架构 > Linux

Linux查找并删除重复文件的命令行fdupes工具,dupeGuru图形工具

2018-03-20 18:29 525 查看
查了几十个网页,找到这个接近满意的解决方案
http://unix.stackexchange.com/questions/146197/fdupes-delete-files-aft...

不过正则里面的叹号好像不能起到清除空行的效果,改为d;
fdupes--recurseA/B/|sed'/^A/d;/^$/d;s/.*/"&"/'|xargsrm

但还有个小问题,如果A里面有重复的文件,但这文件不在B中,fdupes也是会列为结果,导致误删,要再想想

linux通过md5查找重复文件

md5sum*|sort|uniq-w32-D|awk-F'''{print$2}'


















md5sum*先查看所有文件的md5值,重复的文件的md5值相同。

uniq处理时是处理相邻两行,所以需要先排序。

因为处理完后会显示md5值影响观看,可以通过awk命令显示文件名

awk
-F
''
'{print$2}'
#-F指定分隔符,{print$2}指定第几列


编写脚本文件


#!/bin/bash

#文件名:remove_dupliates.sh

#描述:查找当前目录下重复文件,删除

ls-lS--time-style=long-iso|awk'BEGIN{

getline;getline;

name1=$8;size=$5

}

{

name2=$8;

if(size==$5){

"md5sum"name1|getline;csum1=$1;

"md5sum"name2|getline;csum2=$1;

if(csum1==csum2){

printname1;printname2

}

};

size=$5;name1=name2;

}'|sort-u>duplicate_files

catduplicate_files|xargs-I{}md5sum{}|sort|uniq-w32|awk'{print"^"$2"$"}'|sort-u>duplicate_sample

echoRemoving...

commduplicate_filesduplicate_sample-2-3|tee/dev/stderr|xargsrm

echoRemovedduplicatedfilessuccessfully.

此shell工作原理。ls-lS对当前目录所有文件按照文件大小进行排序,并列出文件的详细信息。awk读取ls-lS的输出,对行列进行比较,找出重复文件。

执行逻辑:

将文件依据大小排序并列出,这样大小相近的文件会排列在一起。识别大小相同的文件是我们查找重复文件的第一步。接下来,计算这些文件的校验和。如果校验和相同,那么这些文件就是重复文件,将被删除。

在从文件中读取文本行之前,首先要执行awk(awk是一个强大的文本分析工具)的BEGIN{}语句块.读取文本的工作在{}语句中进行,读取并处理的忣的行后,执行END{}语句块。

使用
$1
,
$2
,
$3...$n
中获取命令输出中的每一列。我们将文件的md5sum保存在变量csum1和csum2中。变量name1和name2保存文件列表中位置连续的文件名。如果两个文件的校验和相同,那它们肯定是重复文件,其文件名会被打印出来。

如何快速找出Linux中的重复文件

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=separate


【1】find-not-empty-typef-printf“%s\n”:find是查找命令;-not-empty是要寻找非空文件;-typef是指寻找常规文件;-printf“%s\n”表示的是文件的大小,单位为bytes
【2】sort-rn:这条命令就是按文件大小进行反向排序
【3】uniq-d:uniq是把重复的只输出一次,而-d指只输出重复的部分(如9出现了5次,那么就输出1个9,而2只出现了1次,并非重复出现的数字,故不输出)
【4】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则是为了防止文件名里带空格而写的参数。

【5】
xargs-0md5sum:xargs是将前面的结果转化为输入,那么这个-0表示读取参数的时候以null为分隔符读取,这也不难理解,毕竟null的二进制表示就是00。后面的md5sum是指计算输入的md5值。
【6】uniq-w32–all-repeated=separate最后这里表示对MD5的前32个字节进行对比,以筛选出重复文件

使用Find命令



听起来好像比较抽象,其实命令就一条:

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=separate


find-not-empty-typef-printf“%s\n”表示使用find命令搜索出所有非空文件,再打印出他们的大小

sort-rn命令不用多说了把,这条命令就是按文件大小进行反向排序

uniq-d|xargs-I{}-n1find-typef-size{}c-print0表示只打印了重复的行,这里使用代表打印出文件名相同的文件

uniq-w32–all-repeated=separate最后这里表示对MD5的前32个字节进行对比,以筛选出重复文件

使用命令行的整个过程就是这么简单和容易。

find-name*.mp3-printf"%s\n"|sort-rn|uniq-d|xargs-I{}-n1find-typef-size{}c-print0|xargs-0md5sum|sort|uniq-w32--all-repeated=separate

fdupes:Linux中查找并删除重复文件的命令行工具

fdupes是Linux下的一个工具,它由AdrianLopez用C编程语言编写并基于MIT许可证发行,该应用程序可以在指定的目录及子目录中查找重复的文件。fdupes通过对比文件的MD5签名,以及逐字节比较文件来识别重复内容,fdupes有各种选项,可以实现对文件的列出、删除、替换为文件副本的硬链接等操作。

文件对比以下列顺序开始:

大小对比>部分MD5签名对比>完整MD5签名对比>逐字节对比

fdupes命令如何使用

1、作为演示的目的,让我们来在某个目录(比如tecmint)下创建一些重复文件,命令如下:

$mkdir/home/"$USER"/Desktop/tecmint&&cd/home/"$USER"/Desktop/tecmint&&foriin{1..15};doecho"ILoveTecmint.TecmintisaverynicecommunityofLinuxUsers.">tecmint${i}.txt;done


在执行以上命令后,让我们使用ls命令验证重复文件是否创建。

$ls-l




total60


-rw-r--r--1tecminttecmint65Aug811:22tecmint10.txt


-rw-r--r--1tecminttecmint65Aug811:22tecmint11.txt


-rw-r--r--1tecminttecmint65Aug811:22tecmint12.txt


-rw-r--r--1tecminttecmint65Aug811:22tecmint13.txt


-rw-r--r--1tecminttecmint65Aug811:22tecmint14.txt


-rw-r--r--1tecminttecmint65Aug811:22tecmint15.txt


-rw-r--r--1tecminttecmint65Aug811:22tecmint1.txt


-rw-r--r--1tecminttecmint65Aug811:22tecmint2.txt


-rw-r--r--1tecminttecmint65Aug811:22tecmint3.txt


-rw-r--r--1tecminttecmint65Aug811:22tecmint4.txt


-rw-r--r--1tecminttecmint65Aug811:22tecmint5.txt


-rw-r--r--1tecminttecmint65Aug811:22tecmint6.txt


-rw-r--r--1tecminttecmint65Aug811:22tecmint7.txt


-rw-r--r--1tecminttecmint65Aug811:22tecmint8.txt


-rw-r--r--1tecminttecmint65Aug811:22tecmint9.txt


上面的脚本创建了15个文件,名称分别为tecmint1.txt,tecmint2.txt……tecmint15.txt,并且每个文件的数据相同,如

"ILoveTecmint.TecmintisaverynicecommunityofLinuxUsers."


2、现在在tecmint文件夹内搜索重复的文件。

$fdupes/home/$USER/Desktop/tecmint




/home/tecmint/Desktop/tecmint/tecmint13.txt


/home/tecmint/Desktop/tecmint/tecmint8.txt


/home/tecmint/Desktop/tecmint/tecmint11.txt


/home/tecmint/Desktop/tecmint/tecmint3.txt


/home/tecmint/Desktop/tecmint/tecmint4.txt


/home/tecmint/Desktop/tecmint/tecmint6.txt


/home/tecmint/Desktop/tecmint/tecmint7.txt


/home/tecmint/Desktop/tecmint/tecmint9.txt


/home/tecmint/Desktop/tecmint/tecmint10.txt


/home/tecmint/Desktop/tecmint/tecmint2.txt


/home/tecmint/Desktop/tecmint/tecmint5.txt


/home/tecmint/Desktop/tecmint/tecmint14.txt


/home/tecmint/Desktop/tecmint/tecmint1.txt


/home/tecmint/Desktop/tecmint/tecmint15.txt


/home/tecmint/Desktop/tecmint/tecmint12.txt


3、使用-r选项在每个目录包括其子目录中递归搜索重复文件。

它会递归搜索所有文件和文件夹,花一点时间来扫描重复文件,时间的长短取决于文件和文件夹的数量。在此其间,终端中会显示全部过程,像下面这样。

$fdupes-r/home




Progress[37780/54747]69%


4、使用-S选项来查看某个文件夹内找到的重复文件的大小。

$fdupes-S/home/$USER/Desktop/tecmint




65byteseach:


/home/tecmint/Desktop/tecmint/tecmint13.txt


/home/tecmint/Desktop/tecmint/tecmint8.txt


/home/tecmint/Desktop/tecmint/tecmint11.txt


/home/tecmint/Desktop/tecmint/tecmint3.txt


/home/tecmint/Desktop/tecmint/tecmint4.txt


/home/tecmint/Desktop/tecmint/tecmint6.txt


/home/tecmint/Desktop/tecmint/tecmint7.txt


/home/tecmint/Desktop/tecmint/tecmint9.txt


/home/tecmint/Desktop/tecmint/tecmint10.txt


/home/tecmint/Desktop/tecmint/tecmint2.txt


/home/tecmint/Desktop/tecmint/tecmint5.txt


/home/tecmint/Desktop/tecmint/tecmint14.txt


/home/tecmint/Desktop/tecmint/tecmint1.txt


/home/tecmint/Desktop/tecmint/tecmint15.txt


/home/tecmint/Desktop/tecmint/tecmint12.txt


5、你可以同时使用-S和-r选项来查看所有涉及到的目录和子目录中的重复文件的大小,如下:

$fdupes-Sr/home/avi/Desktop/




65byteseach:


/home/tecmint/Desktop/tecmint/tecmint13.txt


/home/tecmint/Desktop/tecmint/tecmint8.txt


/home/tecmint/Desktop/tecmint/tecmint11.txt


/home/tecmint/Desktop/tecmint/tecmint3.txt


/home/tecmint/Desktop/tecmint/tecmint4.txt


/home/tecmint/Desktop/tecmint/tecmint6.txt


/home/tecmint/Desktop/tecmint/tecmint7.txt


/home/tecmint/Desktop/tecmint/tecmint9.txt


/home/tecmint/Desktop/tecmint/tecmint10.txt


/home/tecmint/Desktop/tecmint/tecmint2.txt


/home/tecmint/Desktop/tecmint/tecmint5.txt


/home/tecmint/Desktop/tecmint/tecmint14.txt


/home/tecmint/Desktop/tecmint/tecmint1.txt


/home/tecmint/Desktop/tecmint/tecmint15.txt


/home/tecmint/Desktop/tecmint/tecmint12.txt




107byteseach:


/home/tecmint/Desktop/resume_files/r-csc.html


/home/tecmint/Desktop/resume_files/fc.html


6、不同于在一个或所有文件夹内递归搜索,你可以选择按要求有选择性地在两个或三个文件夹内进行搜索。不必再提醒你了吧,如有需要,你可以使用-S和/或-r选项。

$fdupes/home/avi/Desktop//home/avi/Templates/


7、要删除重复文件,同时保留一个副本,你可以使用
-d
选项。使用该选项,你必须额外小心,否则最终结果可能会是文件/数据的丢失。郑重提醒,此操作不可恢复。

$fdupes-d/home/$USER/Desktop/tecmint




[1]/home/tecmint/Desktop/tecmint/tecmint13.txt


[2]/home/tecmint/Desktop/tecmint/tecmint8.txt


[3]/home/tecmint/Desktop/tecmint/tecmint11.txt


[4]/home/tecmint/Desktop/tecmint/tecmint3.txt


[5]/home/tecmint/Desktop/tecmint/tecmint4.txt


[6]/home/tecmint/Desktop/tecmint/tecmint6.txt


[7]/home/tecmint/Desktop/tecmint/tecmint7.txt


[8]/home/tecmint/Desktop/tecmint/tecmint9.txt


[9]/home/tecmint/Desktop/tecmint/tecmint10.txt


[10]/home/tecmint/Desktop/tecmint/tecmint2.txt


[11]/home/tecmint/Desktop/tecmint/tecmint5.txt


[12]/home/tecmint/Desktop/tecmint/tecmint14.txt


[13]/home/tecmint/Desktop/tecmint/tecmint1.txt


[14]/home/tecmint/Desktop/tecmint/tecmint15.txt


[15]/home/tecmint/Desktop/tecmint/tecmint12.txt




Set1of1,preservefiles[1-15,all]:


你可能注意到了,所有重复的文件被列了出来,并给出删除提示,一个一个来,或者指定范围,或者一次性全部删除。你可以选择一个范围,就像下面这样,来删除指定范围内的文件。

Set1of1,preservefiles[1-15,all]:2-15




[-]/home/tecmint/Desktop/tecmint/tecmint13.txt


[+]/home/tecmint/Desktop/tecmint/tecmint8.txt


[-]/home/tecmint/Desktop/tecmint/tecmint11.txt


[-]/home/tecmint/Desktop/tecmint/tecmint3.txt


[-]/home/tecmint/Desktop/tecmint/tecmint4.txt


[-]/home/tecmint/Desktop/tecmint/tecmint6.txt


[-]/home/tecmint/Desktop/tecmint/tecmint7.txt


[-]/home/tecmint/Desktop/tecmint/tecmint9.txt


[-]/home/tecmint/Desktop/tecmint/tecmint10.txt


[-]/home/tecmint/Desktop/tecmint/tecmint2.txt


[-]/home/tecmint/Desktop/tecmint/tecmint5.txt


[-]/home/tecmint/Desktop/tecmint/tecmint14.txt


[-]/home/tecmint/Desktop/tecmint/tecmint1.txt


[-]/home/tecmint/Desktop/tecmint/tecmint15.txt


[-]/home/tecmint/Desktop/tecmint/tecmint12.txt


8、从安全角度出发,你可能想要打印
fdupes
的输出结果到文件中,然后检查文本文件来决定要删除什么文件。这可以降低意外删除文件的风险。你可以这么做:

$fdupes-Sr/home>/home/fdupes.txt


注意:你应该替换
/home
为你想要的文件夹。同时,如果你想要递归搜索并打印大小,可以使用
-r
-S
选项。

9、你可以使用
-f
选项来忽略每个匹配集中的首个文件。

首先列出该目录中的文件。

$ls-l/home/$USER/Desktop/tecmint




total20


-rw-r--r--1tecminttecmint65Aug811:22tecmint9(3rdcopy).txt


-rw-r--r--1tecminttecmint65Aug811:22tecmint9(4thcopy).txt


-rw-r--r--1tecminttecmint65Aug811:22tecmint9(anothercopy).txt


-rw-r--r--1tecminttecmint65Aug811:22tecmint9(copy).txt


-rw-r--r--1tecminttecmint65Aug811:22tecmint9.txt


然后,忽略掉每个匹配集中的首个文件。

$fdupes-f/home/$USER/Desktop/tecmint




/home/tecmint/Desktop/tecmint9(copy).txt


/home/tecmint/Desktop/tecmint9(3rdcopy).txt


/home/tecmint/Desktop/tecmint9(anothercopy).txt


/home/tecmint/Desktop/tecmint9(4thcopy).txt


dupeGuru图形工具查找并移除重复文件

对我们来说,磁盘被装满是棘手问题之一。无论我们如何小心谨慎,我们总可能将相同的文件复制到多个不同的地方,或者在不知情的情况下,重复下载了同一个文件。因此,迟早你会看到“磁盘已满”的错误提示,若此时我们确实需要一些磁盘空间来存储重要数据,以上情形无疑是最糟糕的。假如你确信自己的系统中有重复文件,那么dupeGuru可能会帮助到你。
dupeGuru团队也开发了名为dupeGuru音乐版的应用来移除重复的音乐文件,和名为dupeGuru图片版的应用来移除重复的图片文件。
1.dupeGuru(标准版)

需要告诉那些不熟悉dupeGuru的人,它是一个免费、开源、跨平台的应用,其用途是在系统中查找和移除重复文件。它可以在Linux,Windows,和MacOSX等平台下使用。通过使用一个快速的模糊匹配算法,它可以在几分钟内找到重复文件。同时,你还可以调整dupeGuru使它去精确查找特定文件类型的重复文件,以及从你想删除的文件中,清除某种文件。它支持英语、法语、德语、中文(简体)、捷克语、意大利语、亚美尼亚语、俄语、乌克兰语、巴西语和越南语。
在Ubuntu14.10/14.04/13.10/13.04/12.04中安装dupeGuru

dupeGuru开发者已经构建了一个UbuntuPPA(PersonalPackageArchives)来简化安装过程。想要安装dupeGuru,依次在终端中键入以下命令:

代码如下:
sudoapt-add-repositoryppa:hsoft/ppa
sudoapt-getupdate
sudoapt-getinstalldupeguru-se
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: