blob: b851a9b97750ff5917806ae03f2f597eef85aef7 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
|
#!/bin/bash
set -e -o pipefail
btrfs_subvolume_list_args=('-a' "$@")
list_all_subvolumes()
{
for dev in $(list_btrfs)
do
[ -b "$dev" ] || return
d=/run/btrfs-temp-mount/$(systemd-escape "$dev")
(
mkdir -p "$d" || exit
trap 'umount "$d"; rmdir "$d"' EXIT
set -x
mountpoint -q "$d" || mount -o ro,subvol=/ "$dev" "$d" || return
btrfs subvolume list "$@" "$d"
) | extract_subvolume_path "${d##*/}" || return
done
}
extract_subvolume_path()
{
while read _ id _ gen _ _ toplevel _ path
do
printf '%s/%s\n' "$1" "${path#<FS_TREE>/}"
done
}
list_btrfs()
{
mount -t btrfs | while read
do
printf '%s\n' "${REPLY%% *}"
done | sort -u
}
datetime_glob_a=.snapshot~[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]T[0-9][0-9]:[0-9][0-9]:[0-9][0-9],[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]-[0-9][0-9]:[0-9][0-9]
datetime_glob_b=*_mirror.[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]_[0-9][0-9]:[0-9][0-9]:[0-9][0-9],[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]-[0-9][0-9]:[0-9][0-9]
squash_snapshots()
{
while read line
do
if [[ $line == */$datetime_glob_a ]] || [[ $line == $datetime_glob_b ]]
then
echo "${line%.*}.*"
else
echo "$line"
fi
done | sort -u
}
#SQUASH_SNAPSHOTS=y
if [ "$SQUASH_SNAPSHOTS" ]
then
list_all_subvolumes "${btrfs_subvolume_list_args[@]}" | sort -u | squash_snapshots
else
list_all_subvolumes "${btrfs_subvolume_list_args[@]}"
fi
|