web-dev-qa-db-ja.com

検索-exec rm vs -delete

これら2つのコマンドの違いを理解しようとしています。

Sudo find / -name .DS_Store -delete

そして

Sudo find / -name ".DS_Store"  -exec rm {} \;

execmethodの方が好ましいことに気付きました。どうして?安全/高速/優れているのはどれですか?私はMacbookで両方を使用しましたが、すべてがうまく機能しているようです。

295
Onion

-deleteは、一致したファイルごとに外部プロセスを生成する必要がないため、パフォーマンスが向上します。

-exec rm {} \;findのすべてのバージョンに存在するわけではないため、-deleteが頻繁に推奨される場合があります。現時点では確認できませんが、findを使わずに使用したことは間違いありません。

どちらの方法も「安全」でなければなりません。

[〜#〜] edit [〜#〜] @doitmywayからのコメントごと:名前とが一致することを確認してから、削除し、その逆ではありません(削除してから一致させます)。それ以外の場合一致するかどうかに関係なく、すべてのファイルが削除されます。つまり、DO NOTこれを実行します:find / -delete -name .DS_Store

一致するファイルごとに外部プロセスを生成するオーバーヘッドを回避する一般的な方法は次のとおりです。

find / -name .DS_Store -print0 | xargs -0 rm

(ただし、ここにも移植性の問題があることに注意してください。findのすべてのバージョンに-print0!があるわけではありません。)

280
Celada

.DS_Storeがディレクトリではなくファイルを表すとすると、それを行うための最も移植性が高く、しかも高速な方法は次のとおりです。

Sudo find / -name .DS_Store -exec rm {} +

唯一のリスクはSudoが利用できないことですが、最近は非常に低くなっています。

GNU検索を要求するために使用される-deleteオプションは、他の多くのfind実装ではまだ標準ではないため、常に使用できるわけではありません。

コマンド終了+ではなく\;は、ファイルシステム上に存在するすべての.DS_Storeに対してexecコマンドを実行しないことにより、rm句を高度に最適化します。 。

30
jlliagre

Macbookなどのマシンでは、2つのコマンドのパフォーマンスに大きな違いはありません。ただし、-execバージョンを見ると、微妙な違いがわかります。

Sudo find / -iname ".file-to-delete"  -exec rm {} \;

つまり、「。file-to-delete」という名前のファイルがすべて見つかります。ただし、この検索で​​は、不要な誤検知が返される場合があります。 Sudoで何かをするときは、もう少し注意する必要があります。 -exec rm {}を使用する利点は、次のように引数をrmに渡すことができることです。

Sudo find / -iname "*~"  -exec rm -i {} \;

この例では、emacsが作成するバックアップファイルを削除します。ただし、そのチルダは、不明なファイルに含まれている可能性があり、重要な場合があります。さらに、削除を確認します。そこで、rmコマンドにオプション '-i'を付けました。これにより、インタラクティブな削除が行われます。

また、rmの使用法を調整して、ファイルだけでなくディレクトリも削除できます。

find /usr/local/share/ -iname "useless" -exec rm -r {} \;

簡単に言うと、-execは、見つかったアイテムを削除する実際のコマンドをもう少し制御します。利点は、1つのツールを使用してファイルを検索し、別のツールを使用してファイルを削除することです。また、findユーティリティのすべてのバージョンに-deleteオプションがあるわけではありません。そのため、各ツールを適切な作業に使用することをお勧めします。これはUNIXの哲学です。1つのツール、1つのジョブ、それらを一緒に使用して、必要なことを実行します。

17