实用!在 Linux 中查找重复文件(文件名/MD5校验)

1. 写在前面

本文介绍在 Linux 系统中查找重复文件的一些实用方法,包括:按名称查找重复文件、通过 MD5 校验查找重复文件等,建议收藏。

目录:
—— 3. 按名称查找重复文件;
—— 4. 通过 MD5 校验查找重复文件;
—— 5. 按大小查找重复文件;
—— 6. 使用 fdupes 、 jdupes 、fclones 查找重复文件;

2. 文件结构

本文示例中使用的文件结构:

.
+--jpzhang 目录名
| +--folder1 目录名
|| +--《text-file-1》 文件名
||| 内容: "I am not unique"
|| +--《text-file-2》
||| 内容: "Some random content 1"
|| +--《unique-file-1》
||| 内容: "Some unique content 1nI am a very long line!"
| +--folder2
|| +--《text-file-1》
||| 内容: "I am not unique"
|| +--《text-file-2》
||| 内容: "Some random content 2"
|| +--《unique-file-2》
||| 内容: "Some unique content 2! n I am a short line."
| +--folder3
|| +--《text-file-1》
||| 内容: "I am not unique"
|| +--《text-file-2》
||| 内容: "Some random content 3"
|| +--《unique-file-3》
||| 内容: "Some unique content 3nI am an extreme long line............"

jpzhang 测试目录,包含有三个文件夹:folder1、folder2、folder3。每个文件夹都包含一个内容相同的文本文件 text-file-1 和一个内容不同的文本文件 text-file-2。此外,每个文件夹都包含一个名称和内容都独一无二的 unique-file-x 文本文件。

3. 按名称查找重复文件

查找重复文件最常用的方法是按文件名搜索,可以使用脚本来实现:

awk -F'/' '{
f = $NF
a[f] = f in a? a[f] RS $0 : $0
b[f]++ }
END{for(x in b)
if(b[x]>1)
printf "Duplicate Filename: %sn%sn",x,a[x] }' <(find . -type f)

在 jpzhang 目录中运行它,列出所有名称重复的文件:

root@dev:~/linux/jpzhang# awk -F'/' '{
> f = $NF
> a[f] = f in a? a[f] RS $0 : $0
> b[f]++ }
> END{for(x in b)
> if(b[x]>1)
> printf "Duplicate Filename: %sn%sn",x,a[x] }' <(find . -type f)
--------------------------------------------------------------------------------------
Duplicate Filename: text-file-2
./folder3/text-file-2
./folder1/text-file-2
./folder2/text-file-2
Duplicate Filename: text-file-1
./folder3/text-file-1
./folder1/text-file-1
./folder2/text-file-1

脚本解释:

  • <(find . – type f) :使用进程替换,以便 awk 命令可以读取 find 命令的输出;

  • find . -type f :find 命令会搜索 jpzhang 目录中的所有文件;

  • awk -F’/’ : 使用”/”作为 awk 命令的 FS。这样更容易提取文件名。最后一个字段将是文件名;

  • f = $NF : 将文件名保存在变量 f;

  • a[f] = f in a? a[f] RS $0 : $0 – 如果文件名不在关联数组 a[] 中,将创建一个条目将文件名映射到完整路径,否则,添加一个新行 RS 并将完整路径附加到 a[f];

  • b[f]++ : 创建另一个数组 b[] 来记录文件名 f 被找到的次数;

  • END{for(x in b) :最后,在 END 程序块中,遍历数组 b[] 中的所有条目;

  • if(b[x]>1) :如果文件名 x 出现过不止一次,即有更多的文件以该文件名命名;

  • printf “Duplicate Filename: %sn%sn”,x,a[x] :打印出重复的文件名 x,并打印出带有该文件名的所有完整路径:a[x];

本例中,只搜索重复的文件名。在接下来的示例中,将通过文件内容查找重复文件的不同方法。

4. 通过 MD5 校验查找重复文件

MD5 消息摘要算法(英语:MD5 Message-Digest Algorithm),一种被广泛使用的密码散列函数,可以产生出一个128位(16个字符(BYTES))的散列值(hash value),用于确保信息传输完整一致。

在 Linux 中,可以使用 md5sum 命令来获取文件的 MD5 哈希值。

由于 MD5 是根据文件内容生成的,因此我们可以用它来查找重复文件:

awk '{
md5=$1
a[md5]=md5 in a ? a[md5] RS $2 : $2
b[md5]++ }
END{for(x in b)
if(b[x]>1)
printf "Duplicate Files (MD5:%s):n%sn",x,a[x] }' <(find . -type f -exec md5sum {} +)

这与之前通过文件名搜索的方法非常相似。不过,我们在 find 命令中添加了 -exec md5sum {} + 参数,为每个文件生成 MD5 哈希值。

jpzhang目录中运行,并检查输出结果:

root@dev:~/linux/jpzhang# awk '{
> md5=$1
> a[md5]=md5 in a ? a[md5] RS $2 : $2
> b[md5]++ }
> END{for(x in b)
> if(b[x]>1)
> printf "Duplicate Files (MD5:%s):n%sn",x,a[x] }' <(find . -type f -exec md5sum {} +)
------------------------------------------------------------------------------------------
Duplicate Files (MD5:1d65953b527afb4bd9bc0986fd0b9547):
./folder3/text-file-1
./folder1/text-file-1
./folder2/text-file-1

按 MD5 哈希值搜索,显示内容一致的文本文件完整路径,前面示例中文件名相同 text-file-2因为内容不同并不会出现在搜索结果中;

5. 按大小查找重复文件

当需要检查的文件数量很多时,计算每个文件的哈希值可能需要很长时间。在这种情况下,我们可以先找到大小相同的文件,然后对它们进行哈希值检查,这会加快搜索速度,因为所有重复文件的大小都应该相同。

使用 du 命令来计算文件的大小。

编写一个脚本来查找大小相同的文件:

awk '{
size = $1
a[size]=size in a ? a[size] RS $2 : $2
b[size]++ }
END{for(x in b)
if(b[x]>1)
printf "Duplicate Files By Size: %d Bytesn%sn",x,a[x] }' <(find . -type f -exec du -b {} +)

本例中,在 find 命令中添加了 -exec du -b {} + 参数,将每个文件的大小传递给 awk 命令。

jpzhang 目录下执行:

root@dev:~/linux/jpzhang# awk '{
> size = $1
> a[size]=size in a ? a[size] RS $2 : $2
> b[size]++ }
> END{for(x in b)
> if(b[x]>1)
> printf "Duplicate Files By Size: %d Bytesn%sn",x,a[x] }' <(find . -type f -exec du -b {} +)
------------------------------------------------------------------------------------------
Duplicate Files By Size: 16 Bytes
./folder3/text-file-1
./folder1/text-file-1
./folder2/text-file-1
Duplicate Files By Size: 22 Bytes
./folder3/text-file-2
./folder1/text-file-2
./folder2/text-file-2

就内容重复而言,这些结果是不正确的,因为每个 text-file-2 的内容都不同,即使它们的大小相同。

6. 使用 fdupes 、 jdupes 、fclones 查找重复文件

目前有很多现成的工具集成了多种查找重复文件的方法,例如:检查文件大小和 MD5 校验。若没有对应软件包,可根据 Linux 发行版进行安装;

  • fdupes: 通过比较文件的大小和 MD5 值来工作,如果两者相等,则进行逐字节比较;

  • jdupes: 被认为是 fdupes 的增强版本。在各种数据集的测试中,jdupes 的平均速度比 fdupes快得多;

  • fclones: 可以并行搜索文件,并使用比 md5 快得多的哈希函数;


(1)使用 fdupes 搜索重复文件:

Ubuntu 安装:

sudo apt install fdupes

示例:

root@dev:~/linux/jpzhang# fdupes -r .
--------------------------------------------------------------------------------------
./folder1/text-file-1
./folder2/text-file-1
./folder3/text-file-1

查看帮助:

fdupes -h

(2)使用 jdupes 搜索重复内容:

Ubuntu 安装:

sudo apt install jdupes

示例:

root@dev:~/linux/jpzhang# jdupes -r .
------------------------------------------------------------------------------------------
Scanning: 9 files, 4 items (in 1 specified)
./folder1/text-file-1
./folder2/text-file-1
./folder3/text-file-1

查看帮助:

jdupes -h

(3)使用 fclones 搜索重复内容:

Ubuntu 安装:

sudo snap install fclones

示例:

root@dev:~/linux/jpzhang# fclones group .
------------------------------------------------------------------------------------------
[2024-01-18 00:29:13.321] fclones: info: Started grouping
[2024-01-18 00:29:13.325] fclones: info: Scanned 13 file entries
[2024-01-18 00:29:13.325] fclones: info: Found 9 (266 B) files matching selection criteria
[2024-01-18 00:29:13.326] fclones: info: Found 4 (76 B) candidates after grouping by size
[2024-01-18 00:29:13.326] fclones: info: Found 4 (76 B) candidates after grouping by paths
[2024-01-18 00:29:13.328] fclones: info: Found 2 (32 B) candidates after grouping by prefix
[2024-01-18 00:29:13.329] fclones: info: Found 2 (32 B) candidates after grouping by suffix
[2024-01-18 00:29:13.329] fclones: info: Found 2 (32 B) redundant files
# Report by fclones 0.34.0
# Timestamp: 2024-01-18 00:29:13.329 +0800
# Command: /snap/fclones/26/bin/fclones group .
# Base dir: /root/linux/jpzhang
# Total: 48 B (48 B) in 3 files in 1 groups
# Redundant: 32 B (32 B) in 2 files
# Missing: 0 B (0 B) in 0 files
56e7c64e953c9e1bc00aa9bae37d2111, 16 B (16 B) * 3:
/root/linux/jpzhang/folder1/text-file-1
/root/linux/jpzhang/folder2/text-file-1
/root/linux/jpzhang/folder3/text-file-1

查看帮助:

fclones -h

7. 结论

在本文中,介绍了如何使用文件名、MD5 校验以及通过工具 fdupes 、 jdupes 、fclones 在 Linux 系统中查找重复文件。

感谢您花时间阅读文章!

收藏本站不迷路!


原文始发于微信公众号(滑翔的纸飞机):实用!在 Linux 中查找重复文件(文件名/MD5校验)

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/260836.html

(0)
土豆大侠的头像土豆大侠

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!