私の使命は、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
-f
find
-print
find
Linuxディストリビューションの基本操作です。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
ファイル名の解決を回避できます。find
rm
find /dir/prd/log -mtime +90 -exec rm -f '{}' +
移植性と信頼性が高いだけでなく、rm
上記の出力からプロンプト応答を読み取る問題も回避します(ファイルが見つからない場合は実行全体を防止します)。find
rm
サブディレクトリが含まれている場合は削除できないため、/dir/prod/log
エラーメッセージを防ぐためにフィルタリングする必要があります。rm
find /dir/prd/log ! -type d -mtime +90 -exec rm -f '{}' +