【发布时间】: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 '^\..*$'为我工作!