我尝试在 btrfs 文件系统崩溃后使用以下方法恢复文件:
btrfs restore --path-regex 'regex' -sv -D /dev/sdXX /mnt/destination
例如,要检索/snapshots/@_2018-06-01T23:29:33-04:00.preupgrade/
我尝试过的所有文件http://www.kossboss.com/?p=2277并得到(以及许多其他尝试):
^/(|/snapshots(|/\@\_2018\-06\-01T23\:29\:33\-04\:00\.preupgrade(|/.*)))$
这无法选择任何文件。我已经尝试了 5 个小时。我不知所措。
我做错了什么?我该如何让它工作?
由于多种原因,它需要具有选择性。主要是因为它会在中间失败,我需要编写脚本来选择性地尝试在失败后检索可用的文件。
答案1
btrfs restore
从根目录开始扫描文件系统,并将每个条目与正则表达式进行比较。如果路径与正则表达式匹配并且它是一个目录,它将扫描该目录。如果它是一个文件并且匹配,它将恢复它。
这意味着您尝试恢复的文件/目录的每个父目录都需要通过正则表达式匹配,以确保恢复程序最终能够找到它。
手册页中的示例^/(|home(|/username(|/Desktop(|/.*))))$
正则表达式的实际含义是“/
后面跟着任何内容 或home
后面跟着任何内容 或/username
后面跟着任何内容 或/Desktop
后面跟着任何内容 或/.*
”,相当于“/ 或 /home 或 /home/username 或 /home/username/Desktop 或 /home/username/Desktop/.*”。
不寻常的(|/foo)
构造是不匹配任何内容或/foo
并且嵌套的捕获组只是为了能够嵌套或语句。
为了易读性,我建议将正则表达式写为^(/|/home|/home/username|/home/username/Desktop/|/home/username/Desktop/.*)$
,我认为这更能清楚地说明它的作用。
答案2
好的。我可能已经搞明白了。无论如何,它都能正常工作。冒号和破折号不可转义,而且它们不是正常的正则表达式。对于冒号和破折号等,我能够简单地匹配“。”
按照下面为清楚起见包含的手册页中的说明,我得到了以下信息:
# restore specific path:
# "@_2018-08-17_08.18.30.preupgrade"
btrfs restore --path-regex \
'^/(|snapshots(|/@\_2018.*08.17.*preupgrade(|/.*)))$' \
-s -o /dev/sda5 /media/outputdir/
这仍然留下一个问题:正则表达式格式到底是怎么回事?
来自手册页: --path-regex 仅恢复与正则表达式 (regex(7)) 匹配且格式强制的文件名
^/(|home(|/username(|/Desktop(|/.*))))$
该格式不是很舒服,会恢复整个路径下的目录中的所有文件,因此对于恢复深层层次结构中的单个文件没有用。