检查终端中的重复项?

时间:2009-03-07 11:18:41

标签: scripting shell

以下代码打印了一长串带有哈希和文件名的文件

md5sum *.java

我尝试列出发生相同哈希值的行未成功,以便我可以删除相同的文件。

如何过滤和删除具有相同内容的相同文件?

4 个答案:

答案 0 :(得分:3)

这应该有效:

md5sum *.java | sort | uniq -d -w32

这告诉uniq只比较前32个字符,它只是md5的总和,而不是文件名。

编辑:如果-w不可用,请尝试:

md5sum *.java | awk '{print $1}' | sort | uniq -d

缺点是你不会知道哪些文件有这些重复的校验和...无论如何,如果没有太多的校验和,你可以使用

md5sum *.java | grep 0bee89b07a248e27c83fc3d5951213c1

以后获取文件名(上面的校验和只是一个例子)。我确信有一种方法可以在shell脚本中完成所有这些。

答案 1 :(得分:3)

fdupes并且对重复项的观点较少

使用fdupes这是一个命令行程序,例如

fdupes -r /home/masi/Documents/ > /tmp/1 
less -M +Gg /tmp/1

找到所有重复项并将它们存储在temp中的文件中。 less命令显示所有行的行位置以及您的行程百分比。 我在answer及其明确的维基百科文章here中找到了fdupes。 您可以通过OSX中的自制程序和Linux中的apt-get安装它。

以交互方式使用fdupes删除

运行

fdupes -rd /home/masi/Documents

让你选择要删除的副本,交互式工作的示例视图:

Set 4 of 2664, preserve files [1 - 2, all]: all

   [+] /home/masi/Documents/Exercise 10 - 1.4.2015/task.bib
   [+] /home/masi/Documents/Exercise 9 - 16.3.2015/task.bib

[1] /home/masi/Documents/Celiac_disease/jcom_jun02_celiac.pdf
[2] /home/masi/Documents/turnerWhite/jcom_jun02_celiac.pdf

Set 5 of 2664, preserve files [1 - 2, all]: 2

   [-] /home/masi/Documents/Celiac_disease/jcom_jun02_celiac.pdf
   [+] /home/masi/Documents/turnerWhite/jcom_jun02_celiac.pdf

你看到我有2664个重复项。 有一些静态文件可以保存关于我想要的副本的设置,这将是一件好事。我打开了关于这个here的帖子。 例如,我在一些练习和家庭作业中有相同的围兜文件,因此在用户想要复制时不要问第二次。

答案 2 :(得分:2)

更好:

md5sum *.java | sort | uniq -d

只打印重复的行。

答案 3 :(得分:1)

列出所有文件,在重复项之间加一个空行:

$ md5sum *.txt \ 
  | sort       \
  | perl -pe '($y)=split; print "\n" unless $y eq $x; $x=$y'

05aa3dad11b2d97568bc506a7080d4a3  b.txt
2a517c8a78f1e1582b4ce25e6a8e4953  n.txt
e1254aebddc54f1cbc9ed2eacce91f28  a.txt
e1254aebddc54f1cbc9ed2eacce91f28  k.txt
e1254aebddc54f1cbc9ed2eacce91f28  p.txt
$

仅打印每组中的第一组:

$ md5sum *.txt | sort | perl -ne '($y,$f)=split; print "$f\n" unless $y eq $x; $x=$y'
b.txt
n.txt
a.txt
$ 

如果你很勇敢,将“除非”改为“如果”,然后再改为

$ rm `md5sum ...`

删除除了每组中的第一个以外的所有