1

我正在尝试"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提供更清晰和精确的输出。

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

4

2 回答 2

5

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

希望这可以帮助。

于 2014-10-13T07:18:59.257 回答
0

添加 -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.

希望能帮助到你

于 2012-12-25T09:39:37.880 回答