我正在尝试使用以下命令在目录中搜索字符串"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
可以提供更清晰,更精确的输出。
我的问题是:这两个命令有什么区别?对我而言,他们似乎在执行相同的逻辑,但得到不同的结果。
答案 0 :(得分: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
希望这有帮助。
答案 1 :(得分: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.
希望有所帮助