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


4

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

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


スクリプト、チェックアウトdupinatorを使用することに反対していない場合、このタスクを実行できるPythonスクリプトです。code.activestate.com/recipes/362459
スプーダー

これを試してみました。意図的な重複があるテストフォルダーで重複を検出しません。また、コメント6はデータを失うバグを示しています。code.activestate.com
recipes

回答:


1

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ののプロセス置換すべてをバックアップからの標準出力を供給するため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

4

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

Linux

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


おかげで、助けてくれました!これuniq -w32は本当にパズルの欠けている部分です-部分的な行の一致なしでは、重複を見つけることは非常に困難です(特にシェル言語の場合)。
ピオジョ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.