ディレクトリ名に基づいて古いディレクトリを削除しますか?

ディレクトリ名に基づいて古いディレクトリを削除しますか?

私のBashスクリプトでは、次のように毎月バックアップ用のディレクトリを作成します。

DAY=$(date -d "$D" '+%d')
MONTH=$(date -d "$D" '+%m')
YEAR=$(date -d "$D" '+%Y')

mkdir -p /var/app/backup/$DAY$MONTH$YEAR

たとえば、次のような結果が得られます。

 01012000
 01022000
 01032000
 .
 .
 01012014
 01022014
 01032014
 01042014
 .
 .

数年後、私たちは半年以上のディレクトリを削除しようとします。たとえば、2015年1月1日01012000までのディレクトリは01062000削除する必要があります。

ディレクトリ名に日付がある場合、bashスクリプトから半年以上古いディレクトリを削除する最善の方法は何ですか?

ベストアンサー1

ファイル名を直接比較できる名前(たとえば、Unixタイムスタンプ(エポック以降の秒)またはアルファベットYYYYMMDD順に並べ替えることができる名前)に変換し、6か月以上古いことを確認できます。

たとえば、次のスクリプト(atなど/path/to/compare.sh)は次のようになります。

#! /bin/bash

LAST=$(date -d '6 months ago' +%s)

for FILE
do
    NAME=$(basename $FILE)
    DATE=$(perl -pe 's/(\d{2})(\d{2})(\d{4})/$3$2$1/' <<<$NAME)
    if (( $(date -d "$DATE" '+%s') < $LAST ))
    then
        rm -r $FILE
    fi
done

そして、次のことを行います。

/path/to/compare.sh /var/app/backup/*

ここではこれを秒に変換します。前者を有効な日付として受け入れなかったので、スケジュールをDDMMYYY変更する必要がありました。したがって、秒に変換するのは冗長ですが、なぜ電子が拒否されるのかわかりません(ロケールの問題ですか?)。YYYYMMDDdatedate

おすすめ記事