7日より古いファイル名のファイルを削除する

7日より古いファイル名のファイルを削除する

したがって、私のバックアップサーバーのすべてのファイル名は、archive-2021-03-18.zip、archive-2021-03-19.zipなどで指定されます。名前が7日以上古いファイルを削除するようにcronjobを設定したいと思います。

誰でも私を助けることができますか?

答え1

そしてzsh

#! /bin/zsh -
zmodload zsh/datetime || exit

cd /path/to/backups || exit

strftime -s oldest_to_keep archive-%F.zip $(( EPOCHSECONDS - 7 * 24*60*60 ))

rm -f archive-<->-<1-12>-<1-31>.zip(Ne['[[ $REPLY < $oldest_to_keep ]]'])

答え2

おそらくこれはもう少しエレガントにすることができます。しかし、私はただの単なる人です。また、このスクリプトは新しい行を含むファイル名を偶然発見します(私の人生はこれを一度も見たことがありません)。

$ cat archive_cleaner.sh
#!  /bin/bash

age="7 days ago"

find . -iname 'archive*zip' | while read name; do
        bname=`basename "$name"`
        bdate=`echo "$bname" | sed 's/archive-//;s/.zip//'`
        agemax=`date -d "$age" +%s`   || exit 1
        agesrc=`date -d "$bdate" +%s` || exit 2
        if [ $agesrc -lt $agemax ]; then
                echo /bin/rm -v "$name"
        fi
done

$ pwd
/tmp/test

$ find . -type f
./1/2/3/archive-2021-04-08.zip
./1/2/3/archive-2021-04-07.zip
./1/2/3/archive-2021-04-10.zip
./1/2/3/archive-2021-04-14.zip
./1/2/3/archive-2021-03-19.zip
./1/2/3/archive-2021-03-18.zip

$ archive_cleaner.sh
/bin/rm -v ./1/2/3/archive-2021-04-08.zip
/bin/rm -v ./1/2/3/archive-2021-04-07.zip
/bin/rm -v ./1/2/3/archive-2021-03-19.zip
/bin/rm -v ./1/2/3/archive-2021-03-18.zip

実際にファイルを削除するには、11行目から「echo」を削除してください。

答え3

find命令を確認してください。ここでは実際のファイル日付を使用していますが、このコマンドは検索するファイルのリストで正規表現をサポートしているため、必要な操作を実行できるはずです。

# Find and delete files in the Daily tree more than four days old
# (rounding error means 4.23:59:59 is four days, so keep between three and five dailies)
find /dbdata/daily -mtime +3 -delete

編集:名前でこれを行うことは可能ですが、はるかに難しいです。たとえば、今日の日付と前の7日を表示したい形式で文字列を生成するスクリプトループを作成し、findそれをfindスイッチに渡して、-not -regex保持したいファイルを除くすべてを見つけることができます。

関連情報