Linux 如何递归grep?
如何递归地Linux 如何递归grep?,linux,unix,grep,Linux,Unix,Grep,如何递归地grep所有目录和子目录 find . | xargs grep "texthere" * 第一个参数表示要搜索的正则表达式,而第二个参数表示应搜索的目录。在本例中,表示当前目录 注意:这适用于GNU grep,在某些平台(如Solaris)上,您必须专门使用GNU grep,而不是旧式实现。对于Solaris,这是ggrep命令 还有: find ./ -type f -print0 | xargs -0 grep "foo" 但是grep-r是一个更好的答案。如果您知道所需文件
grep
所有目录和子目录
find . | xargs grep "texthere" *
第一个参数表示要搜索的正则表达式,而第二个参数表示应搜索的目录。在本例中,
表示当前目录
注意:这适用于GNU grep,在某些平台(如Solaris)上,您必须专门使用GNU grep,而不是旧式实现。对于Solaris,这是ggrep
命令 还有:
find ./ -type f -print0 | xargs -0 grep "foo"
但是
grep-r
是一个更好的答案。如果您知道所需文件的扩展名或模式,另一种方法是使用--include
选项:
grep -r --include "*.txt" texthere .
您还可以使用--exclude
提及要排除的文件
银
如果您经常搜索代码,这是一个比grep快得多的替代方案,它是为搜索代码而定制的。例如,默认情况下它是递归的,并自动忽略
.gitignore
中列出的文件和目录,因此您不必一直将同样繁琐的排除选项传递给grep或find。仅文件名也可能有用
grep -r -l "foo" .
我现在始终使用(即使在Windows上使用):
(如中所述,您可以添加2>/dev/null
以作废被拒绝的权限输出)
这包括以下选项:
--include=PATTERN
仅在目录中递归搜索匹配的文件模式
在输出的每一行前加上输入文件中的行号
(注意:添加了该选项,因此您可能希望跳过该选项)
递归读取每个目录下的所有文件;这相当于-d recurse
选项
打印每个匹配的文件名
处理二进制文件,就像它不包含匹配的数据一样这相当于
--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;
...
在POSIX系统中,找不到
grep
的-r
参数和grep-rn“stuff”。
将不会运行,但如果使用find
命令,它将:
find-类型f-execgrep-n“stuff”{}\-打印
经Solaris和HP-UX同意,这应该可以:
grep -R "texthere" *
请注意,
find-键入f | xargs grep whatever
当find匹配的文件太多时,各种解决方案都会遇到“参数列表变长”错误
最好的选择是
grep-r
,但如果不可用,请使用find-类型f-exec grep-H whatever{}\代码>取而代之。ag是我现在最喜欢的方法。它与ack基本相同,但还有一些优化
这里有一个简短的基准。我在每次测试之前清除缓存(cf)
在我的IBM AIX服务器(操作系统版本:AIX 5.2)中,使用:
这将打印出文件中的路径/文件名和相对行号,如:
/公司/xxxx_x.h
2865://**说明:stringYouWannaFind*/
无论如何,它对我来说很有用:)只是为了好玩,如果@christangrant答案太多而无法键入,则快速而肮脏地搜索*.txt文件:-)
grep-r text此处。|grep.txt
如果您要从目录结构中查找所有文件中的特定内容,您可以使用find
,因为这样做更清楚:
find -type f -exec grep -l "texthere" {} +
请注意,-l
(l的小写)显示包含文本的文件名。如果要打印匹配项本身,请将其删除。或者使用-H
将文件与匹配项一起获取。总之,其他备选方案包括:
find -type f -exec grep -Hn "texthere" {} +
其中-n
打印行号。语法为:
The syntax is:
cd /path/to/dir
grep -r <"serch_word name"> .
cd/path/to/dir
格雷普-r。
要查找带有递归包含特定字符串的路径的文件的名称,请使用以下命令
对于UNIX
:
find . | xargs grep "searched-string"
对于Linux
:
grep -r "searched-string" .
在UNIX
服务器上查找文件
find . -type f -name file_name
在LINUX服务器上查找文件
find . -name file_name
grep-r“text此处”。
(末尾的通知期)
(^credit:)
澄清:
grep-r“text此处”/
(递归grepall目录和子目录)
grep-r“texthhere”。
(递归地grep这些目录和子目录)
grep递归
grep[options]模式[文件…]
[选项]
-R,-R,--recursive
递归读取每个目录下的所有文件
这相当于-d recurse
或--directories=recurse
选项
grep帮助
$grep--help
$ grep --help |grep recursive
-r, --recursive like --directories=recurse
-R, --dereference-recursive
选择
ack
()
ag
()下面是在Unix
和Linux
环境中递归搜索字符串的命令
对于UNIX
命令是:
find . -name "string to be searched" -exec grep "text" "{}" \;
grep -r "string to be searched" .
对于Linux
命令是:
find . -name "string to be searched" -exec grep "text" "{}" \;
grep -r "string to be searched" .
这是在我当前的机器(windows 7上的git bash)上为我的案例工作的一个:
我总是忘记带空格的路径的-print0和-0
编辑:我现在首选的工具是ripgrep:。它的速度非常快,并且有更好的默认值(比如默认情况下的递归)。与我的原始答案相同的示例,但使用ripgrep:rg-g“*.cs”“内容模式”
如果您只想遵循实际目录,而不是符号链接
grep -r "thingToBeFound" directory
如果您希望遵循符号链接以及实际目录(注意无限递归)
由于您正在尝试递归grep,以下选项也可能对您有用:
-H: outputs the filename with the line
-n: outputs the line number in the file
因此,如果您希望在当前目录或任何子目录中查找包含达斯·维德的所有文件,并捕获文件名和行号,但不希望递归遵循符号链接,则该命令将是
grep -rnH "Darth Vader" .
如果你想找一个
$ grep --help |grep recursive
-r, --recursive like --directories=recurse
-R, --dereference-recursive
find . -name "string to be searched" -exec grep "text" "{}" \;
grep -r "string to be searched" .
find ./ -type f -iname "*.cs" -print0 | xargs -0 grep "content pattern"
grep -r "thingToBeFound" directory
grep -R "thing to be found" directory
-H: outputs the filename with the line
-n: outputs the line number in the file
grep -rnH "Darth Vader" .
/home/adam/Desktop/TomAndJerry
/home/adam/Desktop/WorldDominationPlot
grep -RH "cats" ../TomAndJerry #relative directory
grep -RH "cats" /home/adam/Desktop/TomAndJerry #absolute directory
grep myText $(find .)
grep myText $(find .) | cut -d : -f 1 | sort | uniq
$ 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
grep -rn "texthere" .
grep -rni "texthere" /
% find . -maxdepth 1 -type d | wc -l
336
% time rg -w aggs -g '*.py'
...
rg -w aggs -g '*.py' 1.24s user 2.23s system 283% cpu 1.222 total
% time ag -w aggs -G '.*py$'
...
ag -w aggs -G '.*py$' 2.71s user 1.55s system 116% cpu 3.651 total
% time find ./ -type f -name '*.py' | xargs grep -w aggs
...
find ./ -type f -name '*.py' 1.34s user 5.68s system 32% cpu 21.329 total
xargs grep -w aggs 6.65s user 0.49s system 32% cpu 22.164 total
grep "texthere" **/*.txt
git grep "pattern"
rg "pattern" .
git grep "texthere"
find . -name \*.gz -print0 | xargs -0 zgrep "STRING"
grep -irn "string" /