web-dev-qa-db-ja.com

30日より古いフォルダーを削除するが、1日目と15日目を省略するBashスクリプト

私はdbバックアップを保存するマウントを持っています。それを制御できないほど大きくなることを避けるために、30日分のバックアップだけでなく、15日ごとに作成されるバックアップも保持するつもりです。したがって、30日が経過すると、フォルダーが1日または15日に作成された場合は、そのままにしておきます。

現在、これを使用してバックアップを30日間のみ保持していますが、1日目と15日目に作成されたフォルダーを省略するにはどうすればよいですか?

find /mnt/clusterfs01-data01/db01/* -type d -ctime +30 -exec rm -rf {} \;

フォルダー名のサンプルディレクトリリスト。

0 drwx------ 7 root root 324 Nov 11 01:35 2016-11-11_01-31-41
0 drwx------ 7 root root 250 Nov 11 06:25 2016-11-11_06-25-03

find以外のソリューションを気にしません。

1
user508889

ディレクトリ名の日時文字列に基づいて一致を除外するには、追加できます

! \( -name '????-15-??*' -o -name '????-30-??*' \)

または

-not \( -name '????-15-??*' -o -name '????-30-??*' \)

findコマンドに。

タイムスタンプに基づいて本当にしたい場合、私がそれを行うことができる唯一の方法は、(notemtime以来ここでtouchを使用していますコマンドは私のシステムのctimeを変更していないようです:%Tdctime%Cdに変更します:

find dir -type d -mtime +30 -printf '%Td\t%p\0' | 
    while read -rd '' day dir; do 
      case "$day" in 
        15|30) ;; 
        *) echo rm -rf -- "$dir";; 
      esac
    done
2
steeldriver

これを試してください:

rm -rf $(find /mnt/clusterfs01-data01/db01/* -maxdepth 0 -type d -ctime +30 | grep -v "[0-9]\{4\}-01\|15-[0-9]\{2\}")
1
Alex Sweetheart