【问题标题】:UNIX: Difference xargs and execUNIX:xargs 和 exec 的区别
【发布时间】:2012-11-30 18:46:06
【问题描述】:

我正在尝试使用以下命令在目录中搜索字符串"rGEO"

find . -name "*" -type f -print | xargs grep "rGEO" 
./home/oper1/AgencyTape/geo/exe/gngeo.cmd:${WEB_DIR}/exe/web_reports.sh -aGN -d${prev_ccyy}${prev_mm} -rGEO -nomail

在这种情况下,我会取回具有匹配行的文件名,以及与上述字符串匹配的行。

find . -name "*" -type f -exec grep "rGEO" {} \;

在这种情况下,我回来了:

${WEB_DIR}/exe/web_reports.sh -aGN -d${prev_ccyy}${prev_mm} -rGEO -nomail

不打印包含该行的文件 - 而且,如您所见,两个输出之间存在很大差异。

使用xargs 可以提供更清晰和精确的输出。

我的问题是:这两个命令有什么区别?对我来说,他们似乎在执行相同的逻辑,但得到不同的结果。

【问题讨论】:

  • 不是Which is faster, 'find -exec' or 'find | xargs -0'? 的完全重复,因为这询问了差异并且该问题询问了哪个更快,但不同之处在于xargs 批量调用命令,而find -exec 调用每个结果命令一次,这使得xargs 更快。
  • 更重要的是:find -execfind -print0 |xargs -0n1 几乎相同,因为-n1 确保每个结果调用一次。

标签: exec xargs


【解决方案1】:

what is the difference between the two commands? To me, they seem to be performing the same logic, but getting different results.

以下是 xargs 和 exec 之间的一个主要区别:

find . -name "*.c" -exec ls -al {} \; 对每个单独的文件执行命令 ls -al。

find . -name "*.c" | xargs ls -al 从 find 命令的输出中构造一个参数列表并将其传递给 ls。

考虑以下 find 命令的输出:

a.c
b.c
c.c

第一个命令(exec)会执行

ls -l a.c
ls -l b.c
ls -l c.c

但第二个 (xargs) 会执行

ls -l a.c b.c c.c

希望这会有所帮助。

【讨论】:

    【解决方案2】:

    添加 -print 也将返回文件名,尽管方式略有不同。

    find . -name "*" -type f -exec grep "rGEO" {} \; -print
    

    我不知道内部工作,这是它的不同之处。 假设 find 命令找到 2 个文件 a.txt 和 b.txt

    -exec 会像这样处理它们。

    grep "rGEO" a.txt
    grep "rGEO" b.txt
    

    但是 xargs 会像..一样工作。

    grep "rGEO" a.txt b.txt.
    

    希望对你有帮助

    【讨论】:

      猜你喜欢
      • 2010-12-11
      • 2013-09-06
      • 2011-11-15
      • 2013-04-29
      • 2010-12-14
      • 2011-06-18
      • 2015-06-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多