可变 rsync 过滤器参数

可变 rsync 过滤器参数

我对变量 rsync 参数有疑问。我在 COMPILE_FILTERS 变量上连接过滤表达式。例子 :

COMPILE_FILTERS='--filter="- js/editor/editorjs/*"'
rsync -a $COMPILE_FILTERS \
  --filter="- *node_modules*" \
  --filter="- .git*" \
  --filter="- /**/.git*" \
  $src $dest

显示以下响应。

Unknown filter rule: `"-'
rsync error: syntax or usage error (code 1) at exclude.c(927) 
[client=3.1.3]

这很奇怪,因为解释器似乎阻止了连字符。

如果您有建议,请提前致谢。

答案1

您的代码有两个问题。

  1. 的扩展$COMPILE_FILTERS未加引号。这意味着它的值--filter="- js/editor/editorjs/*"将会被分割成空格上的单词(默认情况下)。这些词是--filter="-js/editor/editorjs/*"。然后,这些单词将进行文件名生成(通配符),但就您而言,只有当您碰巧在某个地方有一个与该模式匹配的文件时,这才会成为问题js/editor/editorjs/*"

    分成两个词意味着rsync将得到两个论点,并且它无法正确使用其中的第一个(这就是您的错误消息所指的内容)。

    你解决通过双引号引用变量的扩展来解决问题。

  2. 您保存在变量中的字符串包括双引号。如果您对变量的扩展进行双引号,则基本上是在告诉您rsync使用过滤器"- js/editor/editorjs/*"(带双引号和所有内容)。这是因为您在字符串周围使用了单引号。

    你解决通过将正确的字符串分配给变量来解决问题:

    COMPILE_FILTERS=--filter="- js/editor/editorjs/*"
    

    或者

    COMPILE_FILTERS='--filter=- js/editor/editorjs/*'
    

最终结果:

COMPILE_FILTERS='--filter=- js/editor/editorjs/*'
rsync -a "$COMPILE_FILTERS" \
  --filter="- *node_modules*" \
  --filter="- .git*" \
  --filter="- /**/.git*" \
  "$src" "$dest"

请注意,我还引用了代码中涉及的其他变量。

也可以看看:


如果您稍后决定在变量中包含更多过滤器,请确保切换到数组(在支持这些过滤器的 shell 中):

filters=(
    --filter="- js/editor/editorjs/*"
    --filter="- *node_modules*"
    --filter="- .git*"
    --filter="- /**/.git*"
)

rsync --archive "${filters[@]}" "$src" "$dest"

在没有命名数组变量(/bin/sh, dash)的 shell 中,您可以输入 less:

set -- \
    --filter="- js/editor/editorjs/*" \
    --filter="- *node_modules*" \
    --filter="- .git*" \
    --filter="- /**/.git*"

rsync --archive "$@" "$src" "$dest"

您需要一个数组或列表来正确处理单独的过滤器参数。尝试将多个过滤器组合成一个字符串是可行的,但要困难得多,因为您必须正确处理 shell 的分词和文件名通配。

相关内容