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

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

私の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

答え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

関連情報