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