Bash配列に属していないファイルを削除する

Bash配列に属していないファイルを削除する

次に、cronjobを使用して毎日mysqlデータベースをバックアップします。今、サーバーがいっぱいで、月に1つのバックアップ、毎週日曜日に1つのバックアップ、最後の7つのバックアップだけを保持したいと思います。

私のバックアップファイルは次のとおりです(ディレクトリから/var/backup)。

    full_2015-05-16-061115.sql.gz.enc
    full_2015-05-17-061117.sql.gz.enc
    ...

このサーバーエラーの投稿は次のとおりです。https://serverfault.com/a/643335/274380 シェルスクリプトを作成し、正しい日付を決定して配列に入れる方法を助けてください。

上記の投稿のスクリプトをいくつか修正しました。

for i in {0..7}; 
do 
index=$(date +"%Y%m%d" -d "-$i day");
value=$(date +"%Y-%m-%d" -d "-$i day");
keep[index]=$value; 
done; 

for i in {0..4}; 
do 
index=$(date +"%Y%m%d" -d "sunday-$((i+1)) week");
value=$(date +"%Y-%m-%d" -d "sunday-$((i+1)) week");
keep[index]=$value; 
done

for i in {0..12}; 
do
        DW=$(($(date +%-W)-$(date -d $(date -d "$(date +%Y-%m-15) -$i month" +%Y-%m-01) +%-W)))
        for (( AY=$(date -d "$(date +%Y-%m-15) -$i month" +%Y); AY < $(date +%Y); AY++ )); do
                ((DW+=$(date -d $AY-12-31 +%W)))
        done
index=$(date +"%Y%m%d" -d "sunday-$DW weeks");
value=$(date +"%Y-%m-%d" -d "sunday-$DW weeks");
keep[index]=$value; 
done

echo ${keep[@]};

出力は次のとおりです

2014-05-04 2014-06-01 2014-07-06 2014-08-03 2014-09-07 2014-10-05 2014-11-02 2014-12-07 2015-01-04 2015-02-01 2015-03-01 2015-04-05 2015-04-26 2015-05-03 2015-05-10 2015-05-17 2015-05-20 2015-05-21 2015-05-22 2015-05-23 2015-05-24 2015-05-25 2015-05-26 2015-05-27

${keep[@]}だから私の質問は、日付がある場所にファイルを保存し、${keep[@]}残りを削除する方法についてです。

よろしくお願いします!

ベストアンサー1

これが私がする方法です:

find /var/backup/ -type f -maxdetph 1 $(printf "! -name %s " ${keep[*]}) \
  -exec rm {} \;

ファイル名にスペースが含まれていると機能しません。

おすすめ記事