2

这不起作用:

$ tar -cf /tmp/z.tar -C /space/myroot -s '/^\.svn\/patches/__patches' src .svn/patches
tar: Invalid regular expression: trailing backslash (\)
也不好:
$ tar -cf /tmp/z.tar -C /space/myroot -s '/^\\.svn\\/patches/__patches' src .svn/patches
tar: Invalid replacement flag _
反斜杠(最多 4 个)和引号的每个组合都会给我这两个错误之一。但是我知道第一个在 sed 中工作:
$ tar -cf /tmp/z.tar -C /space/myroot src .svn/patches
$ tar -tf /tmp/z.tar | sed 's/^\.svn\/patches/__patches/'
src/a.c
src/b.c
__patches/A.patch
__patches/B.patch
我也知道我可以逃避并做到这一点:
$ tar -cf /tmp/z.tar -C /space/myroot -s '/^.svn.patches/__patches' src .svn/patches
——但我真的不想。
4

1 回答 1

6

man bsdtar

-s 模式
....
其中 old 是一个基本的正则表达式
...

基本正则表达式应该与\/. 可悲bsdtar的是,这里写错了,并且没有正确处理转义。

bsdtar/subst.c

end_pattern = strchr(rule_text + 1, *rule_text);

rule_text是一个字符串char *,它与您传递给-s选项的字符串一起传递,因此它具有字符串/^\.svn\/patches/__patchesend_pattern应该指向模式的最后一个字符(即指向in /from of /__patches)。然而,由于使用了简单的 strchr,所以使用了第一个/找到的(中的字符\/),无论是否转义,都使用它。错误:

tar: Invalid regular expression: trailing backslash (\)

来自regcomp试图解析正则表达式^\.svn\(因为这是两者之间剥离的部分/)。由于表达式中尾部反斜杠后面没有任何内容\,因此会引发错误(并且是正确的 - 尾部反斜杠存在)。可以考虑向 bsdtar 开发人员发布错误报告,但这可能并不值得修复。

请注意,语法-s/old/new/. 模式中有一个尾随/,您缺少该尾随。在最后一个之后,/您可以指定标志。

但是,您可以使用以下方法解决此问题:

bsdtar -s '#\.svn/patches#__patches#'

任何字符都适用于/.

于 2019-01-09T12:43:19.880 回答