これら2つのコマンドの違いを理解しようとしています。
Sudo find / -name .DS_Store -delete
そして
Sudo find / -name ".DS_Store" -exec rm {} \;
exec
methodの方が好ましいことに気付きました。どうして?安全/高速/優れているのはどれですか?私はMacbookで両方を使用しましたが、すべてがうまく機能しているようです。
-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
!があるわけではありません。)
.DS_Store
がディレクトリではなくファイルを表すとすると、それを行うための最も移植性が高く、しかも高速な方法は次のとおりです。
Sudo find / -name .DS_Store -exec rm {} +
唯一のリスクはSudo
が利用できないことですが、最近は非常に低くなっています。
GNU検索を要求するために使用される-delete
オプションは、他の多くのfind
実装ではまだ標準ではないため、常に使用できるわけではありません。
コマンド終了+
ではなく\;
は、ファイルシステム上に存在するすべての.DS_Store
に対してexec
コマンドを実行しないことにより、rm
句を高度に最適化します。 。
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つのジョブ、それらを一緒に使用して、必要なことを実行します。