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