2011-11-27 82 views
2

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

在做了一些研究后,我发现可以使用md5或cksum工具,但我似乎无法使所有的工作。

回答

1

您可以使用awk单行标识来识别重复文件。

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

[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.TXTc.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这个演示文件。如果你有几百个文件来检查dups然后使用一个简单的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 

现在,我们有我们可以利用这个与我们awk一行代码来识别重复的cksum.txt文件。

[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 
0

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

1

首先,把所有的cksums与他们从到一个临时文件中的文件:

cksum * > /tmp/blah

然后排序和uniquify基于前10个字符的文件(校验和自身),保持在受骗者

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

然后删除那些的DUP:

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

+0

而如何保持重复文件的一个副本?这将删除所有副本,除非我错过了某些内容,并且在删除所有副本时确实会删除重复内容,但大多数人希望保留每个文件的一个副本。 –

+1

这不起作用。 ''uniq -d'永远不会显示任何重复项,因为'/ tmp/blah'中的每一行都包含校验和和文件名(实际上你在最后一条命令中依赖这个)。 –

+0

轻松修复。向uniq添加一个'-w 10'。我会编辑答案来说明。 – drysdam