【问题标题】:Can the find command's "exec" feature start a program in the background?find 命令的“exec”功能可以在后台启动程序吗?
【发布时间】:2009-05-14 22:22:49
【问题描述】:

我想做这样的事情:

find . -iname "*Advanced*Linux*Program*" -exec kpdf {} & \;

可能吗?还有其他类似的方法吗?

【问题讨论】:

  • 当你尝试时会发生什么?
  • 你可以尝试转义'&'(即'\&')
  • @dsm 这似乎有效。但它引发了另一个问题,即 {} 返回的某些文件名包含空格和命令 barfs。解决这个问题的简单方法?
  • 单独使用 \& 不应该是可移植的...如果您通过将整个内容放在引号中来逃避它(“kpdf {} &”),那么是的,您将无法使用引用问题。好吧,它们在大多数情况下都可以解决,但这很痛苦。请参阅我的答案(我认为是)更好的解决方案。

标签: linux bash unix


【解决方案1】:

首先,它不会像你输入的那样工作,因为 shell 会将它解释为

find . -iname "*Advanced*Linux*Program*" -exec kpdf {} &
\;

这是一个无效的find在后台运行,后面跟着一个不存在的命令。

即使转义它也不起作用,因为find -exec 实际上是execs 给出的参数列表,而不是将其提供给shell(实际上是处理& 的后台处理)。

一旦你知道这是的问题,你所要做的就是启动一个shell来给这些命令:

find . -iname "*Advanced*Linux*Program*" -exec sh -c '"$0" "$@" &' kpdf {} \;

另一方面,鉴于您正在尝试做的事情,我会建议其中一个

find ... -exec kfmclient exec {} \;  # KDE
find ... -exec gnome-open {} \;      # Gnome
find ... -exec xdg-open {} \;        # any modern desktop

它将在与您的桌面环境关联的默认程序中打开文件。

【讨论】:

  • 感谢 ehemient。 kfmclinet/gnome-open 正是我所需要的。
  • +1 优秀;信息丰富,质量和安全的代码。虽然我个人不确定在仅指定单个位置参数时是否会使用“$@”。我会使用 "$1" 来明确表示或使用 + 而不是 \;如果kpdf支持的话。
【解决方案2】:

如果您的目标只是不必关闭一个 pdf 即可查看下一个,而不是在单独的实例中显示每个 pdf,您可以尝试

find . -iname "*Advanced*Linux*Program*" -exec kpdf {} \+ &

使用 plussed 变体,-exec 像 xargs 一样构建命令行,因此找到的所有文件都将交给同一个 kpdf 实例。最后的 & 会影响整个查找。发现大量文件后,由于命令行变得太长,它可能仍会批量打开它们,但就系统上的资源消耗而言,这甚至可能是一件好事。 ;)

kpdf 必须能够在命令行上获取文件列表才能使其工作,因为我自己不使用它我不知道这个。

【讨论】:

    猜你喜欢
    • 2018-08-05
    • 2015-02-17
    • 1970-01-01
    • 1970-01-01
    • 2013-12-07
    • 1970-01-01
    • 1970-01-01
    • 2018-03-30
    • 1970-01-01
    相关资源
    最近更新 更多