在Linux中,比较2文件夹中每个字节的文件字节数,并查找重复的文件

在Linux中,比较2文件夹中每个字节的文件字节数,并查找重复的文件,linux,bash,shell,Linux,Bash,Shell,我有几个图像文件.jpg、png和更多包含2个目录中的照片,如何在Linux下使用Bash逐字节比较2个目录中的文件,以便: 1突出显示标准输出或文件上两个目录中的重复文件 2仅删除1个重复文件,例如最近的文件。您可能不需要逐字节比较。计算校验和并使用它更容易,碰撞概率也很低。如果您想在慢速磁盘上多次执行此操作,还可以节省一些时间 我有两个目录a和b,其中包含以下文件: $ ls * a: agetty agetty-2 badblocks bridge btrfs btrfs-ima

我有几个图像文件.jpg、png和更多包含2个目录中的照片,如何在Linux下使用Bash逐字节比较2个目录中的文件,以便:

1突出显示标准输出或文件上两个目录中的重复文件


2仅删除1个重复文件,例如最近的文件。

您可能不需要逐字节比较。计算校验和并使用它更容易,碰撞概率也很低。如果您想在慢速磁盘上多次执行此操作,还可以节省一些时间

我有两个目录a和b,其中包含以下文件:

$ ls * a: agetty agetty-2 badblocks bridge btrfs btrfs-image lvreduce lvreduce-2 resize2fs b: agetty agetty-2 bridge 您还可以使用md5sum和其他。md5sum比sha256sum快,但在两个文件具有相同校验和的情况下发生冲突的概率稍高,但仍然足够

文件内容:

b1a58ac886f70cb65cc124bcc8e12a52659fbf5ce841956953d70d29b74869d7  a/resize2fs
c0e532634d14783bbd2ec1a1ed9bfc0b64da4a1efea2e9936fb97c6777ac1e10  a/btrfs-image
d00cdf58189e2171e3cb6610e6290c70ba03ecc0dc46b0570595d9187d769d2e  a/btrfs
fadc2874feb053947ac1a4d8f14df58dabc093fa00b92f01125497ac9a171999  a/badblocks
424cf438ac1b6db45d1f25e237f28cc22bd7098a7fdf0f9c402744dc3f6ea6f2  a/agetty
424cf438ac1b6db45d1f25e237f28cc22bd7098a7fdf0f9c402744dc3f6ea6f2  a/agetty-2
424cf438ac1b6db45d1f25e237f28cc22bd7098a7fdf0f9c402744dc3f6ea6f2  b/agetty
424cf438ac1b6db45d1f25e237f28cc22bd7098a7fdf0f9c402744dc3f6ea6f2  b/agetty-2
424cf438ac1b6db45d1f25e237f28cc22bd7098a7fdf0f9c402744dc3f6ea6f2  b/bridge
7e177d31c45ab550b27ca743e4502cc4be519de4c75b2f479f427930bcb7c7bd  a/bridge
9954909c3436bef767729b8f6034e5f12ef300fad16dc0e540bfa3c89c38b9c6  a/lvreduce
9954909c3436bef767729b8f6034e5f12ef300fad16dc0e540bfa3c89c38b9c6  a/lvreduce-2
您甚至可以直观地比较这些文件。具有相同内容的文件具有相同的校验和。请注意,SHA256校验和为64个十六进制数字/字符长32字节

2.找出重复的行 cat cksums | uniq-Dw 64 | sed's/^\s*\s*/' 输出:

a/agetty
a/agetty-2
b/agetty
b/agetty-2
b/bridge
a/lvreduce
a/lvreduce-2
您还可以将具有相同内容的文件分组:

cat cksums | uniq-组-w 64-组| sed's/^\s*\s*/' 3列出要删除的文件 计数=0 cat cksums | uniq-group-w 64-group | sed's/^\s*\s*/'|读取文件名时 做 如果[-z$filename]] 然后 如果[[1-lt$count]] 然后 echo$prev fi 计数=0 其他的 prev=$filename 计数++ fi 完成
通过将| xargs rm-v添加到done来删除它们。

您可以使用cmp命令比较二进制文件,以确定它们是否相同。使用该命令,尝试一个脚本,然后提出一个更具体的问题。如果文件是相同的,为什么在确定要删除哪个文件时要考虑时间戳?@williampersell事实上,删除哪个并不重要,可以删除第二个搜索目录中的一个,而不是将每个文件与所有其他文件进行比较,考虑为每个文件生成MD5校验和,然后排序并查找重复校验和…
a/resize2fs

a/btrfs-image

a/btrfs

a/badblocks

a/agetty
a/agetty-2
b/agetty
b/agetty-2
b/bridge

a/bridge

a/lvreduce
a/lvreduce-2