質問: ### 実現したいこと Bashでファイルの更新日時から月と日付を見て、ファイルのパスまたはファイル名を抽出したい。 具体的な条件は 5日前のファイルかつ、各月の一番降順のものを一つだけを除き抽出したいです。 ``` 例 現在:6月8日の時 5月27日 5月28日 5月31日 6月1日 6月5日 ←5日前ではないので条件に入らず だったら5月27日と5月28日と6月1日を抽出 ``` のような結果がほしいです。 何かいいアドバイスなど頂けないでしょうか? ### 何やりたいのか cronで定期的に一個のダンプファイル生成と **同時にを更新日時を見て、必ず1ヶ月 一個はダンプファイルを残すようにして削除したい**←出来ないのはこの部分 ### イメージ1 ``` #!/bash/bash find [path]*.gz -mtime +5 -name "*.gz" and 5日前のファイルかつ、各月の一番降順のものを一つだけを除いた条件 | xargs rm -f exit 0 ``` ### イメージ2 ``` #!/bash/bash find [path]*.gz -mtime +5 -name "*.gz" | while IFS= read do ここに処理 done exit 0 ```
回答: > > 5日前のファイルかつ、各月の一番降順のものを一つだけを除き抽出したいです。 > > > 「4日以内のファイルは残す。それを除いた各月の最新のファイルは残す。それ以外は消す」ということですよね。 ``` LAST= find [path]*.gz -mtime +5 -name "*.gz" | while read FILE do YM=$(date +%Y%m -r "$FILE") if test "$LAST" = "$YM" then rm "$FILE" fi LAST="$YM" done ``` 追記: === ↑これでは駄目ですね。findの結果は更新日時順にソートされている訳じゃない。 毎日1ファイル作られているなら、新しい順にソートして、先頭4行をカットすればいいので、 ``` ls -1t *gz | sed 1,4d | while read FILE ・・・ ``` 最初、↑で考えていたのですが、「毎日1ファイル作られているとは限らないな」と思い、投稿の直前に、質問文のfindの行をコピペで書き換えてしまいました。 毎日1ファイル作られているとは限らない場合で、同じ条件だと、面倒そうです。