検索-exec rm vs -delete


260

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

sudo find / -name .DS_Store -delete

そして

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

このexec方法が好ましいことに気づきました。どうして?どちらがより安全/速い/良いですか?私はMacbookで両方を使用しましたが、すべてがうまくいくようです。

回答:


245

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

のすべてのバージョンに存在するわけではない-exec rm {} \;ため、頻繁に推奨される可能性があります。今すぐ確認することはできませんが、それなしで使用したことは間違いありません。-deletefindfind

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

EDIT @doitmywayからのコメントあたり:あなたが名前に一致させると、その後(一致し、その後、削除)の周りに他の方法ではなく、削除します。そうしないと、一致するかどうかにかかわらず、すべてのファイルが削除されます。すなわち、これをしないでくださいfind / -delete -name .DS_Store

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

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

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


2
そうですか。また、指定したファイルツリーを削除する-delete前にスイッチを使用することも読んだ-nameので、注意する必要があると思います。
オニオン

8
最近でfind-exec rm {} +、単一のrmコマンドで一致するすべてのファイルを削除するために使用できます。
jimmij

3
.DS_Storeには特殊文字がまったく含まれていないため、引用符は不要であり、この場合は何も変わりません。
Celada

1
基本的に、空白(スペース、タブ、その他)のみが、引用符で囲まれていない文字列を2つの別個のコマンドライン引数として解釈する唯一の要素ですが、引用するかどうかを決定するときに気にする必要はありません。or またはor や ''などのすべてのシェルメタキャラクターや、引用されていない限りシェルにとって特別な意味を持つ他の多くの文字について心配する必要があります。;|><
セラダ

1
@MarcoMarsala xargsは、コマンドの複数の呼び出しに分割することにより、サイズが制限された引数リストの問題を透過的に処理します。
セラダ

27

.DS_Storeディレクトリではなくファイルを表すと仮定すると、最も移植性が高く、高速な方法は次のとおりです。

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

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

-delete見つけて、まだ他の多くでは非標準でGNUを要求するために使用オプションfindの実装は、そう常に利用可能ではありません。

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


16

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つのジョブ、それらを一緒に使用して必要なことを行います。


3
インタラクティブな確認の-ok rm {} \;代わりにも参照してください -exec rm {} \;
クサラナンダ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.