【问题标题】:find: missing argument to `-exec', even after escaping semicolon发现:缺少“-exec”的参数,即使在转义分号后也是如此
【发布时间】:2016-09-29 18:41:38
【问题描述】:
for i in `ls`; do find /path/to/different/project -name $i -type f -exec sed -i "s/var Handlebars/d" {}; done;

我似乎尝试了所有方法,包括在{} 之后转义;,同时转义;,转义引号,调整sed 命令 - 一切都无济于事。什么给了?

【问题讨论】:

    标签: bash sed exec find-util


    【解决方案1】:

    问题有两个方面。 rici 是正确的,需要一个额外的分号,但之后它仍然失败,除非在 {}\; 之间插入空格字符。最终命令如下所示:

    for i in `ls`; do find /path/to/different/project -name $i -type f -exec sed -i "/var Handlebars/d" {} \;; done;
    

    注意:根据 Cwissy 的评论,我还从 sed 命令中删除了 s(替换)。

    【讨论】:

    • 我明确指出您需要在 {} 之后留一个空格,我的示例显示了这一点。如果您不准备阅读答案,我不知道提问的意义何在。
    • 我没有看到{} 后面的空格写的很清楚。实际上,您的答案中没有任何地方提到空间。我的命令中唯一没有让它不抛出错误的是额外的分号(你确实提到过)和空格。所有其他信息都是不必要的,并且进一步混淆了答案。
    • " {} 和 ; 都必须作为单独的参数出现;如果您使用 {}\;shell 会将它们组合成一个参数"
    • 我现在明白了!对于那个很抱歉。我肯定没有足够深入地考虑这一点。道歉。
    【解决方案2】:

    所写的 sed 命令将失败,因为 sed 期望 s 命令有 2 个参数。 您是否试图删除所有存在“var Handlebars”的行,如果是,那么正确的方法(使用 sed)将是

    sed '/^.*var Handlebars.*$/d'
    

    这就是说“删除(用于 sed 的 'd' 命令)任何包含字符串 'var Handlebars' 的行”

    锚 ^ 和 $ 分别是行首和行尾,'.*' 表示 'var Handlebars' 字符串之前和之后的任何字符的零个或多个。

    所以你的复合命令现在变成了:

    for i in *; do find /path/ -name "$i" -type f -exec sed -i '/^.*var Handlebars.*$/d' {} \; done

    【讨论】:

    • sed -i "/var Handlebars/d" 似乎可以很好地删除包含该字符串的任何行。
    【解决方案3】:

    (不要使用for i in ls。如果任何文件名包含空格,它将失败,并且没有必要。for i in * 完全符合您的要求,无需子进程。)

    正确的语法是:

    for fn in *; do
      find /path/ -name "$fn" -type f -exec sed ... {} \; ;
    done  
    

    \; 是要查找的参数。 {}; 都必须作为单独的参数出现;如果你使用{}\;,shell 会将它们组合成一个参数,find 会将其视为sed 的一个简单参数。

    第二个; 是一个shell 元字符,它终止find 命令。如上所写,在三行中,; 是不必要的,但如果您想要单行,则需要它。如果你将它转义为\;,它就不再是一个shell 元字符,而是简单地作为参数传递给find,在那里它会产生一个错误。

    【讨论】:

    • for i in `ls`; do find /path/ -name $i -type f -exec sed -i "s/var Handlebars/d" {}\; ; done; 这对我来说也失败了。
    • @papiro 请再次阅读我的回答。它特别提到了这个错误。
    • for i in `ls` 对我来说工作得很好(我的文件名都不包含空格)。
    • 如果您转义 both 分号,则会创建您特别提到的另一个错误,这不是我要描述的问题。
    猜你喜欢
    • 2020-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-10
    相关资源
    最近更新 更多