これらの違いを理解しようとしています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!)

コメント

  • が含まれているわけではありません。 ' -nameが指定されたファイルツリーを削除する前に-deleteスイッチを使用することも読みました、だから私は注意する必要があると思います。
  • 最近のfindでは、-exec rm {} +を使用して一致するものをすべて削除できます単一のrmコマンドを含むファイル。
  • .DS_Storeは' t特殊文字が含まれているため、引用符は不要であり、この場合は何も変更されません。
  • 基本的に、引用符で囲まれていない文字列が次のように解釈される原因となるのは、空白(スペース、タブ、その他)のみです。 2つの別々のコマンドライン引数ですが、引用するかどうかを決定するときに申し訳ないのは、'だけではありません。 ;または|または>すべてのシェルメタ文字について心配する必要があります。

または<および “および引用されない限りシェルにとって特別な意味を持つ他の多くの。

  • @MarcoMarsala 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″>

    を使用します。

    コメントを残す

    メールアドレスが公開されることはありません。 * が付いている欄は必須項目です