我如何recursiongrep?

我如何recursion地grep所有的目录和子目录?

 find . | xargs grep "texthere" * 
 grep -r "texthere" . 

第一个参数表示要search的正则expression式,而第二个参数表示应该search的目录。 在这种情况下. 意味着当前目录。

如果你知道你想要的文件的扩展名或模式,另一种方法是使用--include选项:

 grep -r --include "*.txt" texthere . 

你也可以用--exclude提到要排除的文件。

如果您经常search代码, Ag(银search器)是grep更快的替代scheme,它是为search代码而定制的。 例如,它是默认recursion的,并且自动忽略.gitignore列出的文件和目录,所以你不必为grep或find传递相同的繁琐的排除选项。

也:

 find ./ -type f | xargs grep "foo" 

但grep -r是一个更好的答案。

我现在总是使用(即使在Windows上使用GoW – Windows上的Gnu ):

 grep --include="*.xxx" -nRHI "my Text to grep" * 

这包括以下选项:

 --include=PATTERN 

在目录中只search匹配PATTERN文件。

 -n, --line-number 

在每个输出行的前面加上input文件中的行号。

 -R, -r, --recursive 

以recursion方式读取每个目录下的所有文件; 这相当于-d recurse选项。

 -H, --with-filename 

打印每个比赛的文件名。

 -I 

处理二进制文件,就好像它不包含匹配的数据一样;
这相当于--binary-files=without-match选项。

如果我想要不区分大小写的结果,我可以添加' i '(- -nRHIi )。

我可以得到:

 /home/vonc/gitpoc/passenger/gitlist/github #grep --include="*.php" -nRHI "hidden" * src/GitList/Application.php:43: 'git.hidden' => $config->get('git', 'hidden') ? $config->get('git', 'hidden') : array(), src/GitList/Provider/GitServiceProvider.php:21: $options['hidden'] = $app['git.hidden']; tests/InterfaceTest.php:32: $options['hidden'] = array(self::$tmpdir . '/hiddenrepo'); vendor/klaussilveira/gitter/lib/Gitter/Client.php:20: protected $hidden; vendor/klaussilveira/gitter/lib/Gitter/Client.php:170: * Get hidden repository list vendor/klaussilveira/gitter/lib/Gitter/Client.php:176: return $this->hidden; ... 

或者安装ack,如果你想要一个更快的方法,并做了很多。

在POSIX系统中, grepgrep -rn "stuff" .找不到-r参数grep -rn "stuff" . 将不会运行,但是如果您使用find命令,将会:

find . -type f -exec grep -n "stuff" {} \; -print

SolarisHP-UX同意

要findrecursion包含特定string pathfiles名称,请使用以下UNIX命令:

 find . | xargs grep "searched-string" 

对于Linux

 grep -r "searched-string" . 

UNIX服务器上find一个文件

 find . -type f -name file_name 

在LINUX服务器上find一个文件

 find . -name file_name 

ag是我现在最喜欢的方法github.com/ggreer/the_silver_searcher 。 这与ack基本上是一样的,但还有一些优化。

这是一个简短的基准。 我在每次testing之前清除caching(参见https://askubuntu.com/questions/155768/how-do-i-clean-or-disable-the-memory-cache

 ryan@3G08$ sync && echo 3 | sudo tee /proc/sys/vm/drop_caches 3 ryan@3G08$ time grep -r "hey ya" . real 0m9.458s user 0m0.368s sys 0m3.788s ryan@3G08:$ sync && echo 3 | sudo tee /proc/sys/vm/drop_caches 3 ryan@3G08$ time ack-grep "hey ya" . real 0m6.296s user 0m0.716s sys 0m1.056s ryan@3G08$ sync && echo 3 | sudo tee /proc/sys/vm/drop_caches 3 ryan@3G08$ time ag "hey ya" . real 0m5.641s user 0m0.356s sys 0m3.444s ryan@3G08$ time ag "hey ya" . #test without first clearing cache real 0m0.154s user 0m0.224s sys 0m0.172s 

如果你只想跟随实际的目录,而不是符号链接,

 grep -r "thingToBeFound" directory 

如果你想遵循符号链接以及实际目录(注意无限recursion),

 grep -R "thing to be found" directory 

由于您正在尝试greprecursion,以下选项可能对您有用:

 -H: outputs the filename with the line -n: outputs the line number in the file 

所以,如果你想在当前目录或者任何子目录中find包含Darth Vader的所有文件并且捕获文件名和行号,但是不希望recursion遵循符号链接,那么命令将会是

 grep -rnH "Darth Vader" . 

如果你想在目录中find猫的所有提及的话

 /home/adam/Desktop/TomAndJerry 

而你目前在目录中

 /home/adam/Desktop/WorldDominationPlot 

并且您想要捕获文件名而不是string“cats”的任何实例的行号,并且您希望recursion在符号链接发现它们之后,您可以运行以下任一

 grep -RH "cats" ../TomAndJerry #relative directory grep -RH "cats" /home/adam/Desktop/TomAndJerry #absolute directory 

资源:

运行“grep –help”

一个简短的符号链接的介绍,任何人阅读这个答案,并混淆了我的参考: https : //www.nixtutor.com/freebsd/understanding-symbolic-links/

只是文件名也可以是有用的

 grep -r -l "foo" . 

这应该工作:

 grep -R "texthere" * 

如果您正在从目录结构中find所有文件中的特定内容,则可以使用find因为它更清楚您正在做什么:

 find -type f -exec grep -l "texthere" {} + 

请注意, -l (L的下划线)显示了包含文本的文件的名称。 如果您不想打印比赛本身,请将其删除。 或使用-H将文件与匹配一起。 一起来看,其他的select是:

 find -type f -exec grep -Hn "texthere" {} + 

其中-n打印行号。

在我的IBM AIX服务器(操作系统版本:AIX 5.2)中,使用:

 find ./ -type f -print -exec grep -n -i "stringYouWannaFind" {} \; 

这将打印出文件中的path/文件名和相对行号,例如:

./inc/xxxx_x.h

2865:/ **描述:stringYouWannaFind * /

无论如何,它适用于我:)

grep -r "texthere" . (通知期末)

(^信用: https : //stackoverflow.com/a/1987928/1438029 )


澄清:

grep -r "texthere" / (recursion地grep 所有目录和子目录)

grep -r "texthere" . (recursiongrep 这些目录和子目录)

greprecursion

grep [options] PATTERN [FILE...]

[选项]

-R, -r, --recursive

以recursion方式读取每个目录下的所有文件。

这相当于-d recurse--directories=recurse选项。

http://linuxcommand.org/man_pages/grep1.html

grep的帮助

$ grep --help

 $ grep --help |grep recursive -r, --recursive like --directories=recurse -R, --dereference-recursive 

备择scheme

ackhttp://beyondgrep.com/

aghttp://github.com/ggreer/the_silver_searcher

下面是在UnixLinux环境下recursionsearchString的命令。

对于UNIX命令是:

 find . -name "string to be searched" -exec grep "text" "{}" \; 

对于Linux命令是:

 grep -r "string to be searched" . 
 The syntax is: cd /path/to/dir grep -r <"serch_word name"> . 

这是我的当前机器上的工作(git bash在Windows 7上):

 find ./ -type f -iname "*.cs" -print0 | xargs -0 grep "content pattern" 

我总是忘记带有空格的path的-print0和-0。

我想这是你正在写的东西

 grep myText $(find .) 

如果你想findgrep命中的文件,这可能是有用的

 grep myText $(find .) | cut -d : -f 1 | sort | uniq 

注意find . -type f | xargs grep whatever find . -type f | xargs grep whatever find . -type f | xargs grep whatever当遇到太多匹配find的文件时, find . -type f | xargs grep whatever哪种解决scheme都会遇到“Argument list to long”错误。

最好的select是grep -r但如果没有,请使用find . -type f -exec grep -H whatever {} \; find . -type f -exec grep -H whatever {} \; 代替。

只是为了好玩,如果@christangrant的答案太多,input:.

grep -r texthere .|grep .txt

这是一个recursion的(bash和sh)函数,它遍历给定文件夹($ 1)的所有子文件夹,并且在给定文件($ 2)中使用grepsearch给定string($ 3):

 $ cat script.sh #!/bin/sh cd "$1" loop () { for i in * do if [ -d "$i" ] then # echo entering "$i" cd "$i" loop "$1" "$2" fi done if [ -f "$1" ] then grep -l "$2" "$PWD/$1" fi cd .. } loop "$2" "$3" 

运行它和一个示例输出:

 $ sh script start_folder filename search_string /home/james/start_folder/dir2/filename 

有关可用标志的列表:

 grep --help 

返回当前目录中正则expression式texthere的所有匹配项,并带有相应的行号:

 grep -rn "texthere" . 

返回texthere的所有匹配 ,从根目录开始,使用相应的行号并忽略大小写:

 grep -rni "texthere" / 

这里使用的标志:

  • -rrecursion
  • -n输出带有输出的行号
  • -i忽略了情况