変更日とファイル名でスクリプトを削除する

変更日とファイル名でスクリプトを削除する

現在、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.txtAppB.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 fm+6-mtime +6Dfind

一部の実装とは異なり、findロケールで有効な文字を形成しないバイトシーケンスが名前に含まれるファイルを削除することは依然として管理されています。ただしrm、非常に大きなファイルのリストを削除する必要がある場合は実行できません(ただし、この問題を解決するには、組み込みのzargs機能またはzsh/filesモジュールを参照してくださいrm)。

おすすめ記事