使用fdupes来找重复文件


转载自 Linux 中国,如有侵权,立即删除!

对于大多数计算机用户而言,查找并替换重复的文件是一个常见的需求。查找并移除重复文件真是一项令人不胜其烦的工作,它耗时又耗力。但如果你的机器上跑着 GNU/Linux 的操作系统的话,那么查找重复文件会变得十分简单,这多亏了 fdupes 工具。

当然,查找并替换重复的文件的工具还有其他,比如 FSlint 工具。该工具和 fdupes 工具最大的区别就是,其默认提供了一个简单的图形化界面且包含各种功能的命令行版本。

使用fdupes来找重复文件


1. 工具介绍

主要介绍该工具的历史背景以及其查询文件的顺序

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

  • 文件对比以下列顺序开始
  • 大小对比 > 部分 MD5 签名对比 > 完整 MD5 签名对比 > 逐字节对比
# Ubuntu
$ sudo apt install fdupes
$ sudo apt install fslint

# CentOS
# 需要事先安装EPEL源
$ sudo yum install fdupes
$ sudo yum install fslint

# 检查已安装的fdupes版本
$ fdupes --version
fdupes 1.6.1

# 运行图形化客户端
$ fslint-gui

2. 命令参数

发现有一个坑,就是工具的参数支持在不同的版本会有不同!

无论你是否正在使用 Linux 桌面或者服务器,有一些很好的工具能够帮你扫描系统中的重复文件并删除它们来释放空间。图形界面和命令行界面的都有,都可以帮助我们把重复文件从磁盘空间中释放出来,使不必要的浪费得到解决。毕竟,如果你的确需要在不同的位置享有同一个文件,你可以使用软链接或者硬链接,这样就可以在磁盘的一个地方存储数据了。

$ fdupes -h
Usage: fdupes [options] DIRECTORY...

 -r --recurse           对于给定的目录进行递归查找
 -R --recurse:          对于给定的目录进行递归查找
 -s --symlinks          设置软链接
 -H --hardlinks         设置硬链接;两个或多个文件指向同一个磁盘区域
 -n --noempty           排除长度为零的文件
 -A --nohidden          排除隐藏文件
 -f --omitfirst         忽略每组匹配中的第一个文件
 -1 --sameline          在一行中列出每一组匹配项
 -S --size              显示重复文件的大小
 -m --summarize         汇总所有文件信息
 -q --quiet             隐藏进度
 -d --delete            删除重复文件只保留一个副本;数据可能会丢失
 -N --noprompt          与——delete一起使用;删除重复文件只保留一个副本且不提示
 -I --immediate         删除遇到的重复项且不将它们分组
 -p --permissions       不要认为具有不同所有者/组或权限位的文件是重复的
 -o --order=BY          选择排序顺序的输出
 -i --reverse           逆序排序
 -v --version           显示fdupes版本
 -h --help              显示此帮助消息

3. 使用技巧

介绍 fdupes 命令如何使用

作为演示的目的,让我们来在某个目录下创建一些重复文件,命令如下。在执行以上命令后,让我们使用 ls 命令验证重复文件是否创建,且发现每个文件的数据相同。

cd /home/"$USER"/Desktop
for i in {1..15}; do
    echo "Hello World!" > tecmint${i}.txt;
done

现在在 Desktop 文件夹内搜索重复的文件,发现确实列出了相同的文件,但是并没有排序且没有显示文档的大小,不利于我们查看和处理。

$ fdupes /home/$USER/Desktop/
/home/tecmint/Desktop/tecmint13.txt
/home/tecmint/Desktop/tecmint8.txt
......

使用 -r 选项在每个目录包括其子目录中递归搜索重复文件。它会递归搜索所有文件和文件夹,花一点时间来扫描重复文件,时间的长短取决于文件和文件夹的数量。在此其间,终端中会显示全部过程,像下面这样。

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

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

$ fdupes -S /home/$USER/Desktop/
65 bytes each:
/home/tecmint/Desktop/tecmint13.txt
/home/tecmint/Desktop/tecmint8.txt
......

你可以同时使用 -S-r 选项来查看所有涉及到的目录和子目录中的重复文件的大小。不同于在一个或所有文件夹内递归搜索,你可以选择按要求有选择性地在两个或三个文件夹内进行搜索。不必再提醒你了吧,如有需要,你可以使用 -S/-r 选项。

$ fdupes -Sr /home/$USER/Desktop/
65 bytes each:
/home/tecmint/Desktop/tecmint13.txt
/home/tecmint/Desktop/tecmint8.txt
......

107 bytes each:
/home/tecmint/Desktop/resume_files/r-csc.html
/home/tecmint/Desktop/resume_files/fc.html

要删除重复文件,同时保留一个副本,你可以使用 -d 选项。使用该选项,你必须额外小心,否则最终结果可能会是文件/数据的丢失。郑重提醒,此操作不可恢复。你可能注意到了,所有重复的文件被列了出来,并给出删除提示,一个一个来或指定范围或一次性全部删除。你可以选择一个范围,就像下面这样,来删除指定范围内的文件。

# 每个重复文件都会提示
$ fdupes -d /home/$USER/Desktop/
[1] /home/tecmint/Desktop/tecmint13.txt
[2] /home/tecmint/Desktop/tecmint8.txt
......

Set 1 of 1, preserve files [1 - 15, all]: 2-15
   [-] /home/tecmint/Desktop/tecmint/tecmint13.txt
   [+] /home/tecmint/Desktop/tecmint/tecmint8.txt
   ......

# 无提示的删除其他文件
$ fdupes -d -N /home/$USER/Desktop/

从安全角度出发,你可能想要打印 fdupes 的输出结果到文件中,然后检查文本文件来决定要删除什么文件。这样做,可以降低意外删除文件的风险。你应该替换 /home 为你想要的文件夹。同时,如果你想要递归搜索并打印大小,可以使用 -r-S 选项。

# 输出到文件中
$ fdupes -Sr /home > /home/fdupes.txt

在搜索指定目录的重复文件时候,我们可以在计算时分别使用 -n-A 选项排除空白文件以及排除隐藏文件。

# 命令如下所示
$ fdupes -n -A /home

汇总重复文件信息,使用 -m 选项。

$ fdupes -r -m /usr
3492 duplicate files (in 1724 sets), occupying 74.8 megabytes

文章作者: Escape
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Escape !
  目录