识别重复项并删除

时间:2011-11-27 01:38:27

标签: bash

我在目录中有大约20个文件,其中一些文件是重复的。由于它们具有不同的名称,我如何识别哪些是重复的,以便我可以删除它们。

在做了一些研究后,我发现可以使用md5或cksum工具,但我似乎无法使一切正常。

3 个答案:

答案 0 :(得分:1)

首先,将所有带有文件的cksums放入临时文件中:

cksum * > /tmp/blah

然后根据前10个字符(cksum本身)对文件进行排序和统一,保持欺骗

sort /tmp/blah | uniq -w 10 -d > /tmp/blah.dups

然后删除那些重复:

cut -d" " -f3 /tmp/blah.dups | xargs rm

答案 1 :(得分:1)

您可以使用awk one-liner识别重复文件。

让我们创建一些文件,其中一些文件是重复的。

[jaypal~/Temp]$ cat a.txt 
jaypal
[jaypal~/Temp]$ cat b.txt 
singh
[jaypal~/Temp]$ cat c.txt 
jaypal
[jaypal~/Temp]$ cat d.txt 
ayaplj

从上面显示的输出中我们知道文件 a.txt c.txt 是完全相同的。文件 d.txt 即使重新安排了我的名字,也不能归类为重复。

我们将在每个文件上使用cksum实用程序,并在单独的文件中捕获输出。

[jaypal~/Temp]$ cksum a.txt b.txt c.txt d.txt > cksum.txt
[jaypal~/Temp]$ cat cksum.txt 
3007025847 7 a.txt
1281385283 6 b.txt
3007025847 7 c.txt
750690976 7 d.txt

注意:我使用了上述方法,因为此演示只有4个文件。如果您有数百个文件来检查重复,请使用简单的for loop

[jaypal~/Temp]$ for i in ./*.txt; do cksum $i >> cksum1.txt; done
[jaypal~/Temp]$ cat cksum1.txt 
3007025847 7 ./a.txt
1281385283 6 ./b.txt
3007025847 7 ./c.txt
750690976 7 ./d.txt

现在我们有了cksum.txt文件,我们可以将它与我们的awk单行使用来识别重复项。

[jaypal~/Temp]$ awk 'NR==FNR && a[$1]++ { b[$1]; next } $1 in b' cksum.txt cksum.txt 
3007025847 7 a.txt
3007025847 7 c.txt

这将列出目录中包含多个副本的所有文件。 请注意删除这些文件中的任何一个,而不是两者都删除。 :)您始终可以将输出通过管道输出到sort以使它们按顺序排列。

或者,您可以执行以下操作以获取单个重复文件,而不是获取两个副本。我不太喜欢这个的原因是因为它没有告诉我它是什么重复。

[jaypal~/Temp]$ awk '{ x[$1]++; if (x[$1]>1) print $0}' cksum.txt 
3007025847 7 c.txt

答案 2 :(得分:0)

您可以使用sum命令为如下文件生成校验和:sum FILENAME。如果两个文件具有相同的校验和,则极可能(尽管,取决于校验和算法,不是100%保证)它们是相同的。