rmに-fを追加し、findに-printを追加した結果と効果の違いは何ですか?

rmに-fを追加し、findに-printを追加した結果と効果の違いは何ですか?

私の使命は、90日を過ぎたすべてのファイルを再帰的に削除することです。/dir/prd/logつまり、サブディレクトリでも同様です。私は次のようなコマンドを発行しました。

find /dir/prd/log* -mtime +90 | xargs rm

それからUNIXの担当者と話を交わしたが、彼が提案をしましたね。

find /dir/prd/log* -mtime +90 -print | xargs rm -f

私はコマンドに「-print」と「-f」を入れる彼の目的が何であるか疑問に思います。

ベストアンサー1

-fメッセージを表示しないと言うrm例えば読み取り専用ファイルが見つかった場合は、欠落しているファイルを無視して(エラーを表示するのではなく)削除を要求します。削除するファイルが渡されなくても文句はありません。

xargsここでの実装に応じて、標準入力はまたはのパイプになりますrm。そうでない場合、findは!の出力からこれらのプロンプトに対する答えを読むことができます。find/dev/null-ffind

-printfindLinuxディストリビューションの基本操作です。POSIX互換システムただし、明示的に指定する必要があるかもしれません。非常に古いUnixまたはUnixファミリーシステムで

したがって、彼の意図は、命令をより強力で移植可能にすることです。次のバリエーションを使用すると、POSIX以上でより良い結果が得られますfind

find /dir/prd/log -mtime +90 -print0 | xargs -0 rm -f

findこれをサポートする場合は、「特殊」文字(スペース、改行、タブ、一重引用符、二重引用符、バックスラッシュを含む)を含むファイル名に関する問題を避けてください-delete

find /dir/prd/log -mtime +90 -delete

削除を実行するために他のプロセスが作成されるのを防ぎ、いくつかの競合状態の問題も回避します。 (/dir/prd/logコメントで確認されたように、質問の最初の文に記載されている要件に準拠するためにここで指定しました。)

POSIXを使用すると、find独自の実行を要求してxargsファイル名の解決を回避できます。findrm

find /dir/prd/log -mtime +90 -exec rm -f '{}' +

移植性と信頼性が高いだけでなく、rm上記の出力からプロンプト応答を読み取る問題も回避します(ファイルが見つからない場合は実行全体を防止します)。findrm

サブディレクトリが含まれている場合は削除できないため、/dir/prod/logエラーメッセージを防ぐためにフィルタリングする必要があります。rm

find /dir/prd/log ! -type d -mtime +90 -exec rm -f '{}' +

おすすめ記事