如何在旧版本的grep中重现grep的 – recursion选项

我正在研究一个古老的UNIX,它的grep缺less-r / – recursion选项。

我需要find我们的应用程序正在造成的错误,但我不知道我们的应用程序正在写错误的日志文件。 但是,我知道日志文件位于/opt 。 所以我想在*.log下的/opt下findFooErrorMessage。 这是我的尝试:

 find /opt | xargs grep FooErrorMessage 

– 但这不起作用,我不知道在哪里指定,我只是想在命令*.log文件。

你只是想find/opt下的所有日志文件,并searchsomethnig_I_am_looking_for右边? 为什么不:

find /opt -name '*.log' | xargs grep something

要么

find /opt | grep .log | xargs grep something

哦,因为我不知道如何评论其他答案:小心* .log作为shell将解释为globbing,并匹配在当前目录中以.log结尾的所有文件。 您应该使用\ *。log或'* .log'

小心文件名中包含空格,这是Unix允许的。 xargs会窒息他们。 使用find /opt -name '*.log' ... -print0 | xargs -0 grep ... find /opt -name '*.log' ... -print0 | xargs -0 grep ... ,这些选项是为了一起去。

而且,grep或shell可能只有有限的参数,find返回的文件列表可能会超过这个参数。 使用xargs的-n number选项来通过数字文件块运行grep。

你有perl吗?

尝试 – http://betterthangrep.com/

find /opt -type f -name *.log -print | xargs grep 'something_I_am_looking_for'

除了添加“-name”* .log“”之外,尝试在xargs中添加-n1。

也许你的古老的grep不能接受多个input文件,所以-n1将为每个文件运行grep,而不是一次传递它们作为参数

你也可以用exec选项来代替xargs

find/ opt -exec grep“你正在寻找的东西”{} \;

GNU grep有它自己的“recursion”选项:

  grep -R foo /path/to/directory 

要grep特定模式的文件,最好用findxargs

  find /path/to/directory -name \*.log -print0 | xargs -0 grep foo 
 find /opt -name *.log | xargs grep yourstring 

除非你有深层次的子目录,否则grep *,grep /和grep / *很容易记住,难以input错误。