接続日や作成日ではなく、ファイル名でファイルを削除したいです。ファイル名は日付になり、週に一度cronjobを実行して7日より古いファイル名の日付を消去したいと思います。私は一つ作ることができます
find /my/directory -type f -name '*file-name.yyyy-mm-dd.qz' -delete
ただし、機能するには毎週スクリプトを変更する必要があります。私は毎週私の仕事を修正することを避けたいと思います。
ベストアンサー1
これは、ファイル名とディレクトリ名の空白(改行を含む)を正しく処理するより強力な形式です。
find . -type f -name '*.[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9].qz' -exec sh -c 'fdate="${1%.qz}"; fdate="${fdate##*.}"; [ "$fdate" "<" "$(date +%F -d "7 days ago")" ] && rm "$1"' find-sh {} \;
これには、一部の人には見慣れないような多くのシェルトリックが含まれているので、詳しく見てみましょう。
現在のディレクトリから始めて、すべての一般ファイルを再帰的に見つけます。
find . -type f
...名前が正しいパターン「.YYYY-MM-DD.qz」で終わる名前...
-name '*.[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9].qz'
...次に、一致する各ファイルに対してシェルコマンドを実行します(一重引用符を参照)。
-exec sh -c '
...最初に末尾の「.qz」を削除します...
fdate="${1%.qz}";
...その後、「YYYY-MM-DD」のみを残して先行部分を削除します。
fdate="${fdate##*.}";
...そしてその文字列を比較して、7日前の日付に対して「YYYY-MM-DD」より前にソートされていることを(語彙的に)確認します。
[ "$fdate" "<" "$(date +%F -d "7 days ago")" ]
...その場合はファイルを削除してください...
&& rm "$1"'
$0
...エラー報告には、「スクリプト名」(例:)として「find-sh」を使用しています...
find-sh
...そして見つかったファイル名をインラインシェルスクリプトのfind
パラメータ1()に設定します。$1
{} \;