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

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

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

linux 通过md5查找重复文件

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

-c             #在每行前显示该行重复次数。

-d             #只输出重复的行。

-D             #只输出重复的行,有几行输出几行。

-f             #-f 忽略的段数,-f 1 忽略第一段。

-i             #不区分大小写。

-w             #忽略第n个字符以后的内容 。

-s             #-s 5忽略后面5个字符
 

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){

            print name1;print name2

        } 

    };

    size=$5; name1=name2;

}' | sort -u > duplicate_files

cat duplicate_files | xargs -I {} md5sum {} | sort | uniq -w 32 | awk '{ print "^"$2"$" }' | sort -u > duplicate_sample

echo Removing...

comm duplicate_files duplicate_sample -2 -3 | tee /dev/stderr | xargs rm 

echo Removed duplicated files successfully.

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

执行逻辑:

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

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

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

如何快速找出Linux中的重复文件
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

【1】find -not -empty -type f -printf “%s\n” :find是查找命令;-not -empty是要寻找非空文件;-type f是指寻找常规文件;-printf “%s\n”表示的是文件的大小,单位为bytes
【2】sort -rn:这条命令就是按文件大小进行反向排序
【3】uniq -d:uniq是把重复的只输出一次,而-d指只输出重复的部分(如9出现了5次,那么就输出1个9,而2只出现了1次,并非重复出现的数字,故不输出)
【4】xargs -I{} -n1 find -type f -size {}c -print0:这一部分分两部分看,第一部分是xargs -I{} -n1,xargs命令将之前的结果转化为参数,供后面的find调用,其中-I{}是指把参数写成{},而-n1是指将之前的结果一个一个输入给下一个命令(-n8就是8个8个输入给下一句,不写-n就是把之前的结果一股脑的给下一句)。后半部分是find -type f -size {}c -print0,find指令我们前面见过,-size{}是指找出大小为{}bytes的文件,而-print0则是为了防止文件名里带空格而写的参数。

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

使用Find命令

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

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
  • find -not -empty -type f -printf “%s\n” 表示使用find命令搜索出所有非空文件,再打印出他们的大小
  • sort -rn 命令不用多说了把,这条命令就是按文件大小进行反向排序
  • uniq -d | xargs -I{} -n1 find -type f -size {}c -print0 表示只打印了重复的行,这里使用代表打印出文件名相同的文件
  • uniq -w32 –all-repeated=separate 最后这里表示对MD5的前32个字节进行对比,以筛选出重复文件

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

find -name *.mp3 -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

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

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

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

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

fdupes命令如何使用

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

  1. $ mkdir /home/"$USER"/Desktop/tecmint && cd /home/"$USER"/Desktop/tecmint && for i in {1..15}; do echo "I Love Tecmint. Tecmint is a very nice community of Linux Users." > tecmint${i}.txt ; done

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

  1. $ ls -l
  2. total 60
  3. -rw-r--r-- 1 tecmint tecmint 65 Aug 8 11:22 tecmint10.txt
  4. -rw-r--r-- 1 tecmint tecmint 65 Aug 8 11:22 tecmint11.txt
  5. -rw-r--r-- 1 tecmint tecmint 65 Aug 8 11:22 tecmint12.txt
  6. -rw-r--r-- 1 tecmint tecmint 65 Aug 8 11:22 tecmint13.txt
  7. -rw-r--r-- 1 tecmint tecmint 65 Aug 8 11:22 tecmint14.txt
  8. -rw-r--r-- 1 tecmint tecmint 65 Aug 8 11:22 tecmint15.txt
  9. -rw-r--r-- 1 tecmint tecmint 65 Aug 8 11:22 tecmint1.txt
  10. -rw-r--r-- 1 tecmint tecmint 65 Aug 8 11:22 tecmint2.txt
  11. -rw-r--r-- 1 tecmint tecmint 65 Aug 8 11:22 tecmint3.txt
  12. -rw-r--r-- 1 tecmint tecmint 65 Aug 8 11:22 tecmint4.txt
  13. -rw-r--r-- 1 tecmint tecmint 65 Aug 8 11:22 tecmint5.txt
  14. -rw-r--r-- 1 tecmint tecmint 65 Aug 8 11:22 tecmint6.txt
  15. -rw-r--r-- 1 tecmint tecmint 65 Aug 8 11:22 tecmint7.txt
  16. -rw-r--r-- 1 tecmint tecmint 65 Aug 8 11:22 tecmint8.txt
  17. -rw-r--r-- 1 tecmint tecmint 65 Aug 8 11:22 tecmint9.txt

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

  1. "I Love Tecmint. Tecmint is a very nice community of Linux Users."

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

  1. $ fdupes /home/$USER/Desktop/tecmint
  2. /home/tecmint/Desktop/tecmint/tecmint13.txt
  3. /home/tecmint/Desktop/tecmint/tecmint8.txt
  4. /home/tecmint/Desktop/tecmint/tecmint11.txt
  5. /home/tecmint/Desktop/tecmint/tecmint3.txt
  6. /home/tecmint/Desktop/tecmint/tecmint4.txt
  7. /home/tecmint/Desktop/tecmint/tecmint6.txt
  8. /home/tecmint/Desktop/tecmint/tecmint7.txt
  9. /home/tecmint/Desktop/tecmint/tecmint9.txt
  10. /home/tecmint/Desktop/tecmint/tecmint10.txt
  11. /home/tecmint/Desktop/tecmint/tecmint2.txt
  12. /home/tecmint/Desktop/tecmint/tecmint5.txt
  13. /home/tecmint/Desktop/tecmint/tecmint14.txt
  14. /home/tecmint/Desktop/tecmint/tecmint1.txt
  15. /home/tecmint/Desktop/tecmint/tecmint15.txt
  16. /home/tecmint/Desktop/tecmint/tecmint12.txt

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

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

  1. $ fdupes -r /home
  2. Progress [37780/54747] 69%

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

  1. $ fdupes -S /home/$USER/Desktop/tecmint
  2. 65 bytes each:
  3. /home/tecmint/Desktop/tecmint/tecmint13.txt
  4. /home/tecmint/Desktop/tecmint/tecmint8.txt
  5. /home/tecmint/Desktop/tecmint/tecmint11.txt
  6. /home/tecmint/Desktop/tecmint/tecmint3.txt
  7. /home/tecmint/Desktop/tecmint/tecmint4.txt
  8. /home/tecmint/Desktop/tecmint/tecmint6.txt
  9. /home/tecmint/Desktop/tecmint/tecmint7.txt
  10. /home/tecmint/Desktop/tecmint/tecmint9.txt
  11. /home/tecmint/Desktop/tecmint/tecmint10.txt
  12. /home/tecmint/Desktop/tecmint/tecmint2.txt
  13. /home/tecmint/Desktop/tecmint/tecmint5.txt
  14. /home/tecmint/Desktop/tecmint/tecmint14.txt
  15. /home/tecmint/Desktop/tecmint/tecmint1.txt
  16. /home/tecmint/Desktop/tecmint/tecmint15.txt
  17. /home/tecmint/Desktop/tecmint/tecmint12.txt

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

  1. $ fdupes -Sr /home/avi/Desktop/
  2. 65 bytes each:
  3. /home/tecmint/Desktop/tecmint/tecmint13.txt
  4. /home/tecmint/Desktop/tecmint/tecmint8.txt
  5. /home/tecmint/Desktop/tecmint/tecmint11.txt
  6. /home/tecmint/Desktop/tecmint/tecmint3.txt
  7. /home/tecmint/Desktop/tecmint/tecmint4.txt
  8. /home/tecmint/Desktop/tecmint/tecmint6.txt
  9. /home/tecmint/Desktop/tecmint/tecmint7.txt
  10. /home/tecmint/Desktop/tecmint/tecmint9.txt
  11. /home/tecmint/Desktop/tecmint/tecmint10.txt
  12. /home/tecmint/Desktop/tecmint/tecmint2.txt
  13. /home/tecmint/Desktop/tecmint/tecmint5.txt
  14. /home/tecmint/Desktop/tecmint/tecmint14.txt
  15. /home/tecmint/Desktop/tecmint/tecmint1.txt
  16. /home/tecmint/Desktop/tecmint/tecmint15.txt
  17. /home/tecmint/Desktop/tecmint/tecmint12.txt
  18. 107 bytes each:
  19. /home/tecmint/Desktop/resume_files/r-csc.html
  20. /home/tecmint/Desktop/resume_files/fc.html

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

  1. $ fdupes /home/avi/Desktop/ /home/avi/Templates/

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

  1. $ fdupes -d /home/$USER/Desktop/tecmint
  2. [1] /home/tecmint/Desktop/tecmint/tecmint13.txt
  3. [2] /home/tecmint/Desktop/tecmint/tecmint8.txt
  4. [3] /home/tecmint/Desktop/tecmint/tecmint11.txt
  5. [4] /home/tecmint/Desktop/tecmint/tecmint3.txt
  6. [5] /home/tecmint/Desktop/tecmint/tecmint4.txt
  7. [6] /home/tecmint/Desktop/tecmint/tecmint6.txt
  8. [7] /home/tecmint/Desktop/tecmint/tecmint7.txt
  9. [8] /home/tecmint/Desktop/tecmint/tecmint9.txt
  10. [9] /home/tecmint/Desktop/tecmint/tecmint10.txt
  11. [10] /home/tecmint/Desktop/tecmint/tecmint2.txt
  12. [11] /home/tecmint/Desktop/tecmint/tecmint5.txt
  13. [12] /home/tecmint/Desktop/tecmint/tecmint14.txt
  14. [13] /home/tecmint/Desktop/tecmint/tecmint1.txt
  15. [14] /home/tecmint/Desktop/tecmint/tecmint15.txt
  16. [15] /home/tecmint/Desktop/tecmint/tecmint12.txt
  17. Set 1 of 1, preserve files [1 - 15, all]:

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

  1. Set 1 of 1, preserve files [1 - 15, all]: 2-15
  2. [-] /home/tecmint/Desktop/tecmint/tecmint13.txt
  3. [+] /home/tecmint/Desktop/tecmint/tecmint8.txt
  4. [-] /home/tecmint/Desktop/tecmint/tecmint11.txt
  5. [-] /home/tecmint/Desktop/tecmint/tecmint3.txt
  6. [-] /home/tecmint/Desktop/tecmint/tecmint4.txt
  7. [-] /home/tecmint/Desktop/tecmint/tecmint6.txt
  8. [-] /home/tecmint/Desktop/tecmint/tecmint7.txt
  9. [-] /home/tecmint/Desktop/tecmint/tecmint9.txt
  10. [-] /home/tecmint/Desktop/tecmint/tecmint10.txt
  11. [-] /home/tecmint/Desktop/tecmint/tecmint2.txt
  12. [-] /home/tecmint/Desktop/tecmint/tecmint5.txt
  13. [-] /home/tecmint/Desktop/tecmint/tecmint14.txt
  14. [-] /home/tecmint/Desktop/tecmint/tecmint1.txt
  15. [-] /home/tecmint/Desktop/tecmint/tecmint15.txt
  16. [-] /home/tecmint/Desktop/tecmint/tecmint12.txt

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

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

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

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

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

  1. $ ls -l /home/$USER/Desktop/tecmint
  2. total 20
  3. -rw-r--r-- 1 tecmint tecmint 65 Aug 8 11:22 tecmint9 (3rd copy).txt
  4. -rw-r--r-- 1 tecmint tecmint 65 Aug 8 11:22 tecmint9 (4th copy).txt
  5. -rw-r--r-- 1 tecmint tecmint 65 Aug 8 11:22 tecmint9 (another copy).txt
  6. -rw-r--r-- 1 tecmint tecmint 65 Aug 8 11:22 tecmint9 (copy).txt
  7. -rw-r--r-- 1 tecmint tecmint 65 Aug 8 11:22 tecmint9.txt

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

  1. $ fdupes -f /home/$USER/Desktop/tecmint
  2. /home/tecmint/Desktop/tecmint9 (copy).txt
  3. /home/tecmint/Desktop/tecmint9 (3rd copy).txt
  4. /home/tecmint/Desktop/tecmint9 (another copy).txt
  5. /home/tecmint/Desktop/tecmint9 (4th copy).txt

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

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

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

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

代码如下:
sudo apt-add-repository ppa:hsoft/ppa
sudo apt-get update
sudo apt-get install dupeguru-se

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

  1. Linux系统中查找、删除重复文件,释放磁盘空间。

    在Linux系操作系统中查找并删除重复文件的方法的确有很多,不过这里介绍的是一款非常简单实用的软件FSlint.FSlint是一个重复文件查找工具,可以使用它来清除不必要的重复文件,笔者经常使用它来释 ...

  2. 在 Linux 中查找和删除重复文件

    原文链接:https://www.linuxprobe.com/linux-FSlint.html FSlint同时具有GUI和CLI模式.因此,对于新手来说,这是一个用户友好的工具.FSlint不仅 ...

  3. awk删除重复文件

    #!/bin/bash #查找并删除重复文件,每个文件只保留1份 ls -LS --time-style=long-iso | awk 'BEGIN { getline; getline; name1 ...

  4. oracle中查找和删除重复记录的几种方法总结

    平时工作中可能会遇到当试图对库表中的某一列或几列创建唯一索引时,系统提示 ORA-01452 :不能创建唯一索引,发现重复记录. 下面总结一下几种查找和删除重复记录的方法(以表CZ为例): 表CZ的结 ...

  5. 在windows下解压缩Linux内核源代码出现重复文件原因

    在windows下解压缩Linux内核源代码出现重复文件原因 2009年06月30日 13:35 来源:ChinaUnix博客 作者:embededgood 编辑:周荣茂     原因一.因为在Lin ...

  6. 提高Linux运维效率的30个命令行常用快捷键

    提高Linux运维效率的30个命令行常用快捷键 表4-1  30个常用快捷键 快捷键 功能说明 最有用快捷键 tab 命令或路径等的补全键,Linux最有用快捷键* 移动光标快捷键 Ctrl+a 光标 ...

  7. linux下使用script和scriptreplay对命令行操作进行录像

    转自:linux下用script和scriptreplay对命令行操作录像 在Linux中可以使用script命令来记录命令行的操作过程,并使用scriptreplay命令对命令操作进行回放,操作步骤 ...

  8. gplaycli—— 用于从 GooglePlayStore 中下载和管理 Apk 文件的命令行工具

    gplaycli-- 用于从 GooglePlayStore 中下载和管理 Apk 文件的命令行工具 这个 GooglePlay市场 中 https://play.google.com/store/a ...

  9. shell脚本命令 运行python文件&python命令行运行python代码

    单独的python文件运行的时候 报错: 在shell脚本中,运行shell脚本命令:在Python命令行中,运行Python代码.然而,“python hello.py”是一个脚本命令,不是pyth ...

随机推荐

  1. 玩转Metasploit系列(第二集)

    在上一节的内容中,大家了解了Metasploit的结构.这一节我们主要介绍的是msfconsole的理论. msfconsole理论 在MSF里面msfconsole可以说是最流行的一个接口程序.很多 ...

  2. bzoj 2151 贪心

    几乎完全类似于1150的思路,直接参考那个就行了. http://www.cnblogs.com/BLADEVIL/p/3527193.html /************************** ...

  3. vc6.0里使用lib(静态库)的方法

    vc6.0 中使用lib文件 使用库的方法如下:1. 包含库的头文件(把库的头文件包含到项目中)在应用程序工程中使用#include "file path"file path可以为 ...

  4. [Leetcode Week4]Merge Two Sorted Lists

    Merge Two Sorted Lists题解 原创文章,拒绝转载 题目来源:https://leetcode.com/problems/merge-two-sorted-lists/descrip ...

  5. HDU1028 (整数拆分)

    Ignatius and the Princess III Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K ...

  6. linux内核源码中两个重要的宏

    转载:http://www.cnblogs.com/skywang12345/p/3562146.html 倘若你查看过Linux Kernel的源码,那么你对 offsetof 和 containe ...

  7. Windows+Git+TortoiseGit+COPSSH安装图文教程【转】

    转自:http://blog.csdn.net/aaron_luchen/article/details/10498181/ Windows+Git+TortoiseGit+COPSSH 安装图文教程 ...

  8. swap增加

    #创建17G的文件dd if=/dev/zero of=/data/swap/swap-1 bs=1024 count=16255000#设置为swap分区/sbin/mkswap /data/swa ...

  9. easyui时间控件用js实时获取选定的时间的取法

    easyui时间控件用js实时获取选定的时间的取法var   datetime=$("#id").datetimebox("getValue");不能用 $(& ...

  10. 关于 Notepad++ 崩溃之后正在编辑文件内容被清空的致命问题的补救措施

    Notepad++ 以其功能强大.界面简洁.操作简单方便.超低内存耗用而受众多挨踢从业者青睐. Notepad++ 不像 UE 那样在你编辑的时候会定时生成 bak 备份文件.虽然 Notepad++ ...