我如何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系统中, grep
和grep -rn "stuff" .
找不到-r
参数grep -rn "stuff" .
将不会运行,但是如果您使用find
命令,将会:
find . -type f -exec grep -n "stuff" {} \; -print
由Solaris
和HP-UX
同意
要findrecursion包含特定string
path
的files
名称,请使用以下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
选项。
grep的帮助
$ grep --help
$ grep --help |grep recursive -r, --recursive like --directories=recurse -R, --dereference-recursive
备择scheme
ack
( http://beyondgrep.com/ )
下面是在Unix
和Linux
环境下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)中使用grep
search给定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" /
这里使用的标志:
-
-r
recursion -
-n
输出带有输出的行号 -
-i
忽略了情况