Linux

Linux

我正在使用 OSX 10.8.4,如果 md5 哈希值匹配,我想删除单个平面目录中的重复文件。

我查找了几个答案,但没有一个适合我,我想这是因为终端版本之间的命令语法存在差异。

我尝试过的事情:

http://www.chriswrites.com/2012/02/how-to-find-and-delete-duplicate-files-in-mac-os-x/

使用脚本查找并删除 osx 中的重复文件

其中一些: http://www.commandlinefu.com/commands/view/3555/find-duplicate-files-based-on-size-first-then-md5-hash#comment

这种方法感觉最接近:

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 uniqgrep例如(在这个例子中,我删除了大小标准,但其余部分相同):

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

相关内容