find ~ -name delete_me -type f -print0 | xargs -0 /bin/rm -f
Q1.どういう意味-print0
で、なぜ必要なのですか?
Q2.なぜ/bin/rm
?なぜできないのですrm -f
か?
このコマンドは、~
ディレクトリから一致するファイルのみを削除し、サブディレクトリまたはサブディレクトリから一致するファイルを削除しません。
Q3.サブディレクトリでも一致するすべてのファイルを見つけて削除するように変更するにはどうすればよいですか?
Q4.特定のディレクトリが見つからないように変更するには?
ありがとう
ベストアンサー1
非標準
-print0
述部は、「改行文字ではなく終了ヌル文字で見つかったファイルのパス名を印刷する」という意味です。これは改行文字を含むファイル名を処理できるようにするためです(Unixシステムでは許可されていますが、nul文字はUnixファイル名の一部にはできません)。find
使用されたコマンドの出力を読み取るコマンドは、-print0
エントリがnullで終了することに注意してください。この-0
オプションを使用すると、xargs
null で終わる項目を読み取ることができます。これは必須ではありません。どちらもありません
find "$HOME" -name delete_me -type f -delete
もう標準ではありません。
find "$HOME" -name delete_me -type f -exec rm {} +
これら2つのコマンドは
-print0
コマンドと同じことを行い、デフォルトで使用する必要がありますxargs
。xargs
このユーティリティは、ファイルまたは他のコマンドからパラメータを読み取るときに便利です。ご使用の際には、find
内蔵された施設を利用することが-exec
より安全です。そこはい同時展開を開始するユーティリティなど、特定の実装でxargs
実行できるタスクと実行できないタスクがあります。-exec
ただし、この演習ではこの方法は使用されません。変数のように動作するので、シェルスクリプトで使用する方が良いですが、
"$HOME"
そうではありません。~
$HOME
~
また、この
-f
オプションは必要ない場合があります。ユーティリティをrm
避けるために使用されます。rm
失敗する(診断メッセージと非ゼロ終了ステータスを含む)指定されたパス名が存在しないか、rm
削除するパス名なしで呼び出される場合。また、古い-i
(対話型モード)オプションをオーバーライドします。ただし、ここのコマンドライン-i
にはオプションがなく、そのパスを見つけるために使用されたrm
パス名が存在することがfind
保証されています(ファイルが実行中に他のプロセスによって実際に削除される競合状態がない限り、削除find
実行者によって)find
。rm
find
変数値に合理的なユーティリティパスセットが含まれているという保証がない限り、フルパスを使用する
rm
理由はありません。PATH
破損は一般的ではなく、PATH
絶対パスを使用してユーティリティを作成するスクリプトは、他のシステムに移動すると簡単に破損する可能性があります。実際には、ホームディレクトリのすべてのサブディレクトリで繰り返しました。
検索ツリーから避けたいディレクトリを削除します。たとえば、次のような名前のすべてのディレクトリを避けるには
avoid
:find "$HOME" -name avoid -prune -o -name delete_me -type f -exec rm {} +
深さ優先検索を
-delete
意味するため、ここでは使用できません。-depth
深さ優先検索では、ディレクトリが検索ツリーから削除される必要があるavoid
ことを知る前に、その中のすべてのサブディレクトリとファイルにアクセスします。avoid
別の例:入力しないでください特定目次
$HOME/dir/save_me
:find "$HOME" -path "$HOME/dir/save_me" -prune -o -name delete_me -type f -exec rm {} +