私の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
変更する必要がありました。したがって、秒に変換するのは冗長ですが、なぜ電子が拒否されるのかわかりません(ロケールの問題ですか?)。YYYYMMDD
date
date