bash で古い BTRFS スナップショットを削除する

bash で古い BTRFS スナップショットを削除する

独自の小さなバックアップ スクリプトを作成しようとしています。BTRFS スナップショットを使用して、しばらく保存しておきたいと考えています。その間、スナップショットの作成は私にとって問題ではなくなりましたが、5 日後にそれらを再度削除したいと思います。

スナップショットの作成時刻を取得するために、次のコマンドを作成しました。

/usr/bin/find /run/btrfs-root/sdb/__snapshot/ -mindepth 1 -maxdepth 1 -name "auto-sn-*" -exec /usr/sbin/btrfs subvolume show {} \; | /usr/bin/grep "__snapshot|Creation"

出力:

__snapshot/auto-sn-data-20210803
        Creation time:          2021-08-03 14:59:01 +0200
__snapshot/auto-sn-Log-20210803
        Creation time:          2021-08-03 15:00:42 +0200

残念ながら、出力日付文字列に基づいて削除を決定する方法が見つかりません。ここでの正確な質問は、この情報に基づいて 5 日後にスナップショットの削除を開始するにはどうすればよいかということです。

ありがとう

小さなアイデア:

/usr/bin/find /run/btrfs-root/sdb/__snapshot/ -mindepth 1 -maxdepth 1 -name "auto-sn-*" ! \( -name "*$(/usr/bin/date -d '1 day ago' +%Y%m%d)" -o -name "*$(/usr/bin/date -d '2 day ago' +%Y%m%d)"  -o -name "*$(/usr/bin/date -d '3 day ago' +%Y%m%d)" \) -exec /usr/sbin/btrfs subvolume delete {} \;

これがうまくいくかどうかは分からない

答え1

日付だけを取得するには、次のようにします。

$ btrfs subvolume show / | grep -oP 'Creation time:\s*\K\d.*$'
# 2021-03-11 04:22:58 +0100

幸いなことに、日付は ISO 形式なので、通常の bash 文字列比較関数を使用して簡単に比較できるため、この時点で基本的に完了です。

$ old_date=$(btrfs subvolume show / | grep -oP 'Creation time:\s*\K\d.*$')
(some time passes)
$ new_date=$(btrfs subvolume show / | grep -oP 'Creation time:\s*\K\d.*$')
$ [[ "$old_date" < "$new_date" ]] && echo newer || echo older

関連情報