镜像自地址
https://github.com/tuna/tunasync.git
已同步 2025-12-07 23:16:47 +00:00
btrfs snapshot gc
这个提交包含在:
36
tunasync_snapshot_gc.py
普通文件
36
tunasync_snapshot_gc.py
普通文件
@@ -0,0 +1,36 @@
|
||||
#!/usr/bin/env python2
|
||||
# -*- coding:utf-8 -*-
|
||||
import re
|
||||
import sh
|
||||
import os
|
||||
import argparse
|
||||
|
||||
if __name__ == "__main__":
|
||||
parser = argparse.ArgumentParser(prog="tunasync_snapshot_gc")
|
||||
parser.add_argument("--max-level", type=int, default=2, help="max walk level to find garbage snapshots")
|
||||
parser.add_argument("--pattern", default=r"^_gc_\d+", help="pattern to match garbage snapshots")
|
||||
parser.add_argument("mirror_root", help="tunasync mirror root")
|
||||
|
||||
args = parser.parse_args()
|
||||
|
||||
pattern = re.compile(args.pattern)
|
||||
|
||||
def walk(_dir, level=1):
|
||||
if level > 2:
|
||||
return
|
||||
|
||||
for fname in os.listdir(_dir):
|
||||
abs_fname = os.path.join(_dir, fname)
|
||||
if os.path.isdir(abs_fname):
|
||||
if pattern.match(fname):
|
||||
print("GC: {}".format(abs_fname))
|
||||
try:
|
||||
ret = sh.btrfs("subvolume", "delete", abs_fname)
|
||||
except sh.ErrorReturnCode:
|
||||
print("Error: {}".format(ret.stderr))
|
||||
else:
|
||||
walk(abs_fname, level+1)
|
||||
|
||||
walk(args.mirror_root)
|
||||
|
||||
# vim: ts=4 sw=4 sts=4 expandtab
|
||||
在新工单中引用
屏蔽一个用户