web-dev-qa-db-ja.com

OSXLionのコマンドラインを使用してファイルを重複排除します

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ファイルが作成されますが、空です。

これらのファイルを重複排除するにはどうすればよいですか?

4
SimplGy

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

ハッシュキーに基づいて重複を見つけることはうまく機能し、非常に高速です。私は次のコードをよく使用します。これをMacで実行していて問題が発生した場合は、GNUツールをインストールし、2番目のバージョンを使用してください。

Linux

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

Mac版

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

4
kumar