私の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
答え2
ご質問から削除された部分に集中させていただきます。次のファイル名のリストがある場合:
$ cat data.txt
01012000
01022000
01032000
01012014
01022014
01032014
01042014
6ヶ月の期限が「01022014」であることをご存知ですか?次のようにsort
&を使用して、sed
削除するファイルを決定できます。
これにより、ファイルが逆順にソートされます。
$ sort -r data.txt
01042014
01032014
01032000
01022014
01022000
01012014
01012000
これにより、期限「01022014」までのすべての最新ファイルが削除されます。
$ sort -r data.txt | sed '1,/01032000/d'
01022014
01022000
01012014
01012000
メモ: sed '1,/PATTERN/d'
PATTERN が表示されるまで、最初の行から始めて表示されるd
すべての行を削除します。1,
最後に、削除のためにリストを送信できますxargs
。
$ sort -r data.txt | sed '1,/01032000/d' | xargs rm
答え3
範囲中括弧拡張を使用できます。
6ヶ月ごとに削除:
echo /path/to/directories/01{01..06}{2000..2014}
または、過去半年を除くすべてのアイテムを削除します。
echo /path/to/directories/01{01..12}{2000..2013}
echo /path/to/directories/01{01..06}2014
パスをecho
次に置き換えて更新します。rm -r