
現在、7日以上経過したファイルを削除するスクリプトを作成しています。これが私の現在のスクリプトです。
find -type f -mtime +6 -exec rm -rf {} \;
LOGS
ファイル名に含まれる内容のみを削除するように名前パターンを含める必要があります。サンプルファイル:
- ApplicationA.txt
- アプリケーションB.txt
- AppA_LOGS.txt
- AppB_LOGS.txt
AppA_LOGS.txt
ファイルのみを削除しAppB_LOGS.txt
(7日が過ぎたと仮定)、7日を超えてApp.txt
もAppB.txt
保存します。
これを現在のスクリプトにどのように追加できますか?ありがとうございます。
答え1
名前でフィルタリングするには、-name
シェルワイルドカードで使用されているものと同様のワイルドカードパターンに従う述語を使用します。
find . -name '*_LOGS.txt' -type f -mtime +6 -exec rm -f {} +
通常、ファイルメタデータベースのフィルタよりも安いので、最初にこのフィルタを配置することをお勧めします(一部のfind
実装では自動的に順序が変更されますが)。これにより、名前がファイルで終わらず、_LOGS.txt
ファイルが除外された場合にfind
そのメタデータを検索する必要がなくなります。
シェルワイルドカードと同様に、*
すべての文字シーケンスと一致します。シェルグローブとは異なり、名前が(hidden files)で始まるファイルに対して特別な処理がないため、.
そのファイルも含まれます。名前がで始まるディレクトリのファイルについても同様です.
。
また、rm
複数のファイル名を引数として使用できるため、+
代わりに区切り文字;
として使用できます-exec
。また、find
終了コードを使用してエラーを報告できるという利点もあります。rm
find
また、移植性のためには、検索する場所を知るために少なくとも1つのファイルまたはディレクトリを引数として提供する必要があります。一部の実装では、どこを表示するかを指定しない限り、デフォルトでは(現在の作業ディレクトリ)に設定されますが、find
他の実装ではそうではありません。.
を使用している場合は、zsh
次のこともできます。
rm -f -- **/*_LOGS.txt(D.m+6)
これは of と.
同じで、隠しファイルと隠しディレクトリのファイルも考慮します。-type f
m+6
-mtime +6
D
find
一部の実装とは異なり、find
ロケールで有効な文字を形成しないバイトシーケンスが名前に含まれるファイルを削除することは依然として管理されています。ただしrm
、非常に大きなファイルのリストを削除する必要がある場合は実行できません(ただし、この問題を解決するには、組み込みのzargs
機能またはzsh/files
モジュールを参照してくださいrm
)。