【问题标题】:Exclude everything staring with dot in lftp mirror command排除 lftp 镜像命令中所有以点为中心的内容
【发布时间】:2019-05-14 14:16:45
【问题描述】:

我正在使用LFTP 使用 CI/CD 管道供应商将一些 Git 文件从 Docker 映像镜像到我的服务器。这可以按预期工作,但是当使用 LFTP 中的 mirror 命令时,我需要排除任何以点开头的文件,如下所示:

lftp -u $USERNAME, -e "[...] mirror [...] --ignore-time -x '/(\.\w*.*)/$' --exclude README.md [...]; exit" sftp://$HOST

但这些都不起作用,它只是 跳出 -x 命令并执行下一个命令(例如--exclude README.md)。

我猜不是使用-x--exclude,因为来自the docs

镜像 [OPTS] [来源 [目标]]

[...]

-x RX, --exclude=RX 排除匹配文件

这些也不起作用:

-x '/(\.\w*.*)/$'
-x /(\.\w*.*)/$
-x /(\.\w*.*)/
-x (\.\w*.*)
-x \.\w*.*

那有什么问题吗?这不是 Bash 的有效正则表达式吗?

【问题讨论】:

  • 最好我可以从您的代码中看出,不是 bash 试图理解您的正则表达式 mirror。 idk 关于 lftp 具体但很少有工具会在正则表达式中理解\w。如果您尝试使用 \w 表示“单词组成字符”,请尝试将其替换为 POSIX [[:alnum:]_],例如-x '^\.[[:alnum:]_]*',但这可能不是必需的,因为匹配以. 开头的任何字符串的正则表达式只是^\.
  • 这是你的正则表达式 \. 它匹配它找到的第一个点,不管它在哪里。如果您只想匹配开头或空格然后点,请使用^\s*\.^[ \t]*\.
  • @EdMorton 差不多。匹配任何以. 开头的字符串的正则表达式是^\..*,因为^\. 只会匹配点本身。我希望这听起来不像是吹毛求疵,但这是不同的。
  • @EdMorton 我很高兴我们解决了这个问题 - 我开始觉得自己像个迂腐的害虫。
  • @EdMorton 你说的完全正确哈哈哈无论如何,--exclude '^\..*$' 为我工作!

标签: regex bash lftp


【解决方案1】:

出于某种原因,对我有用的唯一方法是在 --exclude 正则表达式的末尾使用 $,如下所示:

lftp -u $USERNAME, -e "[...] mirror [...] --exclude '^\..*$'[...]

如果没有行尾分隔符,它似乎根本不起作用,只需忽略 --exclude-x 选项并转到下一个选项。此外,正则表达式必须用引号引起来(单引号或双引号)。

希望这对某人有帮助:)

【讨论】:

    【解决方案2】:

    像这样使用 -X 选项可能更容易: -X .* -X .*/

    【讨论】:

      猜你喜欢
      • 2012-03-25
      • 2012-11-13
      • 1970-01-01
      • 1970-01-01
      • 2017-10-03
      • 1970-01-01
      • 2021-07-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多