これらの違いを理解しようとしています2つのコマンド:
sudo find / -name .DS_Store -delete
および
sudo find / -name ".DS_Store" -exec rm {} \;
-exec ... {}
の方法が推奨されます。なぜですか?どちらがより安全/高速/優れているのですか? Macbook の両方で使用しましたが、すべてが正常に機能しているようです。
回答
-delete
は、それぞれに外部プロセスを生成する必要がないため、パフォーマンスが向上します。
-delete
がに存在しないため、-exec rm {} \;
が頻繁に推奨される場合があります。 find
のすべてのバージョン。現在確認できませんが、find
を使用したことは確かです。
B他のメソッドは「安全」である必要があります。
EDIT @doitmywayからのコメントごと:一致していることを確認してください名前を入力して次に削除します。その逆ではありません(削除してから一致させます)。そうしないと、一致するかどうかに関係なく、すべてのファイルが削除されます。つまり、これを行わないでください:find / -delete -name .DS_Store
。
一致したファイルごとに外部プロセスを生成するオーバーヘッドを回避するための一般的な方法は次のとおりです。
find / -name .DS_Store -print0 | xargs -0 rm
(ただし、ここにも移植性の問題があることに注意してください。検索のすべてのバージョンに-print0
!)
コメント
または<
および “および引用されない限りシェルにとって特別な意味を持つ他の多くの。
xargs
は、制限されたサイズの引数リストの問題を、コマンドの複数の呼び出しに分割することで透過的に処理します。回答
.DS_Store
がディレクトリではなくファイルを表すと仮定すると、最もポータブルで高速な方法は次のようになります。
sudo find / -name .DS_Store -exec rm {} +
唯一のリスクは、sudo
が利用できないことですが、最近はかなり低くなっています。
-delete
オプションはGNU検索を要求するために使用され、他の多くのfind
実装ではまだ標準ではないため、常に使用できるとは限りません。
コマンドの終了+
in \;
の代わりに、それぞれに対してrm
コマンドを実行しないことにより、exec
句を高度に最適化します。ファイルシステムに存在するすべての.DS_Store
。
回答
このようなマシンの場合Macbookとして、2つのコマンドのパフォーマンスに大きな違いはありません。ただし、-execバージョンを見ると、微妙な違いがわかります。
sudo find / -iname ".file-to-delete" -exec rm {} \;
これは、「。file」という名前のファイルがすべて見つかることを意味します。 -削除する」。ただし、この検索では、不要な誤検知が返される場合があります。 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つのツールを使用してファイルを検索し、別のツールを使用してファイルを削除することです。また、検索ユーティリティのすべてのバージョンに-deleteオプションがあるわけではありません。 したがって、適切な仕事のために各ツールを使用する方が良いでしょう。 これがUNIXの哲学です。1つのツール、1つのジョブ、それらを一緒に使用して、必要なことを実行します。
コメント
- ivも参照してください。 インタラクティブな確認のために、
-exec rm {} \;
の代わりにid = “ecc4fb1268″>
を使用します。
-name
が指定されたファイルツリーを削除する前に-delete
スイッチを使用することも読みました、だから私は注意する必要があると思います。find
では、-exec rm {} +
を使用して一致するものをすべて削除できます単一のrm
コマンドを含むファイル。.DS_Store
は' t特殊文字が含まれているため、引用符は不要であり、この場合は何も変更されません。;
または|
または>
すべてのシェルメタ文字について心配する必要があります。