我正在使用 OSX 10.8.4,如果 md5 哈希值匹配,我想删除单个平面目录中的重复文件。
我查找了几个答案,但没有一个适合我,我想这是因为终端版本之间的命令语法存在差异。
我尝试过的事情:
http://www.chriswrites.com/2012/02/how-to-find-and-delete-duplicate-files-in-mac-os-x/
这种方法感觉最接近:
find . -size 20 \! -type d -exec cksum {} \; | sort | tee /tmp/f.tmp | cut -f 1,2 -d ' ' | uniq -d | grep -hif - /tmp/f.tmp > duplicates.txt
但是我收到一个错误:grep: -: No such file or directory
经检查,/tmp/f.tmp 确实存在。创建了 duplicates.txt 文件,但它是空的。
我该如何删除这些文件的重复数据?
答案1
在 Mac OS 上,默认情况下,您将获得 BSD grep
,而您发布的命令很可能适用于 GNU grep
。这两个版本的工具相似,但不完全相同。其他工具也是如此(例如, GNU 和 BSD 版本的date
行为也略有不同)。
问题出-
在 grep 命令之后。GNUgrep
将其解释为stdin
(因此,那些已被 标识为重复的行uniq -d
),而 BSDgrep
实际上正在寻找名为 的 while -
;因此出现错误消息:
>> find . \! -type d -exec cksum {} \; | sort | tee /tmp/f.tmp | cut -f 1,2 -d ' ' | uniq -d | grep -hif - /tmp/f.tmp
grep: -: No such file or directory
-
如果您用与任何文件都不匹配的另一个名称替换,也会发生同样的事情:
>> find . \! -type d -exec cksum {} \; | sort | tee /tmp/f.tmp | cut -f 1,2 -d ' ' | uniq -d | grep -hif unknown-file /tmp/f.tmp
grep: unknown-file: No such file or directory
你可以抨击流程替代将所有东西的标准输出作为文件提供给 to uniq
,grep
例如(在这个例子中,我删除了大小标准,但其余部分相同):
>> grep -hif <(find . \! -type d -exec cksum {} \; | sort | tee /tmp/f.tmp | cut -f 1,2 -d ' ' | uniq -d) /tmp/f.tmp
4192268874 275 ./foo/META-INF/leiningen/foo/foo/project.clj
4192268874 275 ./foo/project.clj
答案2
根据 hashkey 查找重复项效果很好,而且速度非常快。我经常使用以下代码。如果您在 Mac 上运行此代码并遇到任何问题,请安装 GNU 工具并使用第二个版本。
Linux
查找 -not -empty -type f -printf "%s\n" | sort -rn | uniq -d | xargs -I{} -n1 查找 -type f -size {}c -print0 | xargs -0 md5sum | sort | uniq -w32 --all-repeated=separate
Mac 版本
gfind -not -empty -type f -printf "%s\n" | sort -rn | guniq -d | xargs -I{} -n1 find -type f -size {}c -print0 | xargs -0 gmd5sum | sort | guniq -w32 --all-repeated=separate