如何生成正则表达式来恢复“btrfs restore”的特定文件夹?

如何生成正则表达式来恢复“btrfs restore”的特定文件夹?

我尝试在 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(|/.*))))$

该格式不是很舒服,会恢复整个路径下的目录中的所有文件,因此对于恢复深层层次结构中的单个文件没有用。

相关内容