我在目录中有大约20个文件,其中一些文件是重复的。由于它们具有不同的名称,我如何识别哪些是重复的,以便我可以删除它们。
在做了一些研究后,我发现可以使用md5或cksum工具,但我似乎无法使一切正常。
答案 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%保证)它们是相同的。