/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/