【问题标题】:find: missing argument to -exec in bash script查找:在 bash 脚本中缺少 -exec 的参数
【发布时间】:2012-12-20 10:35:51
【问题描述】:

当我在命令行中准确键入时,以下内容可以正常工作:

find /<some_path>/{epson,epson_laser,epson_inkjet} -iname "*.ppd" 
  -exec grep "\*ModelName\:" {} \; | sed 's/.*\"\(.*\)\"/\1/'

但是,当我尝试从 bash 脚本我得到find: missing argument to -exec'

我还尝试了以下方法(在许多变体中):

eval find "$1" -iname "*.ppd" -exec 'bash -c grep "\*ModelName\:" "$1" | sed "s/.*\"\(.*\)\"/\1/" \;

正如find-exec-echo-missing-argument-to-exec 中提到的。 我怎样才能不仅在终端中,而且在 bash 脚本中都可以使用第一个代码?

P.S.:我使用 eval 仅用于将字符串 "/&lt;some_path&gt;/{epson,epson_laser,epson_inkjet}" 扩展到多个路径。有谁知道这样做的更好解决方案?

【问题讨论】:

  • 该错误意味着没有看到 \; 参数,但在我上面看起来很好。请从您的脚本中粘贴确切的 find 行。
  • 好吧,脚本中的哪一行 find 没关系,因为没有人工作;)但是如何获得与我输入的第一行相同的结果,但让它在 bash 脚本中工作?当我将第一行直接输入到终端时,第一行有效,但在 bash 中,任何组合都不起作用。
  • 当你使用eval 时,你必须加倍转义。第一个为原始 shell 转义字符,第二个为eval 转义。
  • 这就是为什么最好将-exec命令放入脚本中,这样就不需要使用eval了。
  • 实际上,我不知道你为什么首先需要使用eval

标签: bash shell find


【解决方案1】:

如果您想对find 的输出执行多个命令,只需根据需要多次使用-exec 选项:

find -exec command1 "{}" \; -exec command2 "{}" \;

您还可以定义执行选项的条件:

find \( -exec command1 \; -false -o -exec command2 \; \)

在你的情况下,你需要这样的东西:

find /<some_path>/{epson,epson_laser,epson_inkjet} -iname "*.ppd" -exec grep "\*ModelName\:" "{}" \;  sed 's/.*\"\(.*\)\"/\1/' "{}" \;

【讨论】:

    猜你喜欢
    • 2012-01-30
    • 1970-01-01
    • 2011-02-27
    • 2014-04-05
    • 1970-01-01
    • 2020-04-11
    • 1970-01-01
    • 1970-01-01
    • 2019-06-22
    相关资源
    最近更新 更多