递归搜索包含空格的字符串

递归搜索包含空格的字符串

/home/myuser我想在目录下递归搜索“此表......”字符串,即在下的所有文件/home/myuser和下的所有目录和子目录中/home/myuser

/home/myuser目录设置为环境变量:$MYUSR

搜索必须不区分大小写,并且它应该给我包含“此表...”字符串的文件的完整路径名。

我尝试:

grep -R "this table..." $MYUSR

但我不确定它是否真的在搜索,因为我等了很长时间,它没有返回任何结果,而且它永远不会结束。

我还想知道如何在我所在的目录中递归地进行相同的搜索,也许像这样:

grep -R "this table..." .

我该怎么做?

答案1

  find $MYUSR -type f -print0 | xargs -0 -n 10 grep -i -l 'this table...'

选项find包括

  • -type f - 我们不想搜索目录(仅搜索其中的文件)、设备等
  • -print0 - 我们希望能够处理包含空格的文件名

选项xargs包括

  • -0 - 因为 find -print0
  • -n 10 - 一次对 10 个文件运行 grep(在不使用 grep 时很有用-l

grep 的选项是

  • -i - 忽略大小写
  • -l - 仅列出文件名(不是所有匹配的行)
  • -f - 将搜索表达式中的点视为普通的点。

要在当前目录中启动,请替换$MYUSR.


更新(一位超级用户建议find -type f -exec grep -i "this table..." +

$ ls -1
2011
2011 East
2011 North
2011 South
2012


$ find -type f -exec grep -i 'this table...'
find: missing argument to `-exec'

$ find -type f -exec grep -i 'this table...' +
find: missing argument to `-exec'

$ find -type f -exec grep -i 'this table...' {} \;
this table... is heavy
THIS TABLE... is important
this table... is mine
this table... is all alike
this table... is twisty

但这没用,你想要文件名

$ find -type f -exec grep -i -l 'this table...' {} \;
./2011 East
./2011
./2011 North
./2011 South
./2012

好的,但你经常也想看到匹配行的内容

如果您想要文件名和匹配的行内容,我可以这样做:

$ find -type f -print0 | xargs -0 -n 10 grep -i 'this table...';
./2011 East:this table... is heavy
./2011:THIS TABLE... is important
./2011 North:this table... is mine
./2011 South:this table... is all alike
./2012:this table... is twisty

-print0但如果没有“老派”,-0你就会陷入混乱

$ find -type f | xargs -n 10 grep -i 'this table...';
./2011:THIS TABLE... is important
grep: East: No such file or directory
./2011:THIS TABLE... is important
./2011:THIS TABLE... is important
grep: North: No such file or directory
./2011:THIS TABLE... is important
grep: South: No such file or directory
./2012:this table... is twisty

答案2

这取决于您搜索的目录和子目录的大小。但ack更适合您的需求。请参阅http://betterthangrep.com/

相关内容