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ファイルが作成されますが、空です。
これらのファイルを重複排除するにはどうすればよいですか?
Mac OSのデフォルトでは、BSD grep
を取得しますが、投稿したコマンドはおそらくGNU grep
用です。2つのバージョンのツールは似ていますが、同一ではありません。これは他のツールにも当てはまります(たとえば、GNUとBSDバージョンのdate
の動作もわずかに異なります)。
問題は、grepコマンドに続く-
です。 GNU grep
はこれをstdin
(したがって、uniq -d
によって重複として識別された行)として解釈しますが、BSD grep
は実際には-
と呼ばれる時間を探しています。したがって、エラーメッセージは次のとおりです。
>> 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
Bashの プロセス置換 を使用して、stdoutを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
ハッシュキーに基づいて重複を見つけることはうまく機能し、非常に高速です。私は次のコードをよく使用します。これをMacで実行していて問題が発生した場合は、GNUツールをインストールし、2番目のバージョンを使用してください。
find -not -empty -type f -printf "%s\n" |並べ替え-rn | uniq -d | xargs -I {} -n1 find -type f -size {} c -print0 | xargs -0 md5sum |並べ替え| uniq -w32 --all-repeated = separate
gfind -not -empty -type f -printf "%s\n" |並べ替え-rn | guniq -d | xargs -I {} -n1 find -type f -size {} c -print0 | xargs -0 gmd5sum |並べ替え| guniq -w32 --all-repeated = separate