首页 文章

我如何递归grep?

提问于
浏览
1423

我如何递归 grep 所有目录和子目录?

find . | xargs grep "texthere" *

24 回答

  • 0

    以下是在 UnixLinux 环境中递归搜索 String 的命令 .

    for UNIX 命令是:

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

    for Linux 命令是:

    grep -r "string to be searched" .
    
  • 8

    请注意,当find匹配的文件太多时, find . -type f | xargs grep whatever 种解决方案将遇到"Argument list to long"错误 .

    最好的选择是 grep -r ,但如果没有,请改用 find . -type f -exec grep -H whatever {} \; .

  • 3

    我想这就是你要写的东西

    grep myText $(find .)
    

    如果你想找到grep命中的文件,这可能是其他有用的东西

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

    在2018年,您希望使用 ripgrepthe-silver-searcher ,因为它们比替代方案更快 .

    这是一个包含336个第一级子目录的目录:

    % 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
    

    在OSX上,这会安装 ripgrepbrew install ripgrep . 这将安装 silver-searcherbrew install the_silver_searcher .

  • 2148

    如果您只想关注实际目录,而不是符号链接,

    grep -r "thingToBeFound" directory
    

    如果你想跟随符号链接和实际目录(注意无限递归),

    grep -R "thing to be found" directory
    

    由于您尝试递归grep,以下选项也可能对您有用:

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

    因此,如果要在当前目录或任何子目录中查找包含Darth Vader的所有文件并捕获文件名和行号,但不希望递归遵循符号链接,则命令将为

    grep -rnH "Darth Vader" .
    

    如果你想在目录中找到所有提到的单词cat

    /home/adam/Desktop/TomAndJerry
    

    而你目前在目录中

    /home/adam/Desktop/WorldDominationPlot
    

    并且您想要捕获文件名但不是字符串“cats”的任何实例的行号,并且您希望递归遵循符号链接,如果找到它们,您可以运行以下任一项

    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/

  • 1

    有关可用标志的列表:

    grep --help
    

    返回当前目录中regexp texthere的所有匹配项,以及相应的行号:

    grep -rn "texthere" .
    

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

    grep -rni "texthere" /
    

    flags used here:

    • -r 递归

    • -n 打印带输出的行号

    • -i 忽略大小写

  • 588

    或者安装确认,如果你想要更快的方式并且正在做这么多 .

  • 5

    在POSIX系统中,您找不到 grep-r 参数,而您的 grep -rn "stuff" . 将无法运行,但如果您使用 find 命令,它将:

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

    同意 SolarisHP-UX .

  • 5

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

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

    您还可以提及要使用 --exclude 排除的文件 .

    Ag

    如果您经常搜索代码,Ag (The Silver Searcher)是grep的一个更快的替代方法,默认情况下's customized for searching code. For instance, it'递归并自动忽略 .gitignore 中列出的文件和目录,因此您不必继续将相同的繁琐排除选项传递给grep或find .

  • 6

    我现在总是使用(甚至在Windows上使用GoW -- Gnu on Windows):

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

    这包括以下选项:

    --include=PATTERN
    

    仅在搜索匹配PATTERN的文件的目录中递归 .

    -n, --line-number
    

    使用输入文件中的行号为每行输出添加前缀 .

    -R, -r, --recursive
    

    递归地读取每个目录下的所有文件;这相当于-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;
    ...
    
  • 20

    这应该工作:

    grep -R "texthere" *
    
  • 54

    ag是我现在最喜欢的方式github.com/ggreer/the_silver_searcher . 它与ack基本相同,但还有一些优化 .

    这是一个简短的基准 . 我在每次测试前清除缓存(参见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
    
  • 2

    也:

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

    grep -r 是一个更好的答案 .

  • 1

    只是文件名也很有用

    grep -r -l "foo" .
    
  • 3

    这是我当前机器上的情况(Windows 7上的git bash):

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

    对于带空格的路径,我总是忘记-print0和-0 .

    编辑:我现在的首选工具是ripgrep:https://github.com/BurntSushi/ripgrep/releases . 它真的很快并且有更好的默认值(默认情况下是递归) . 与我的原始答案相同,但使用ripgrep: rg -g "*.cs" "content pattern"

  • 8

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

    (^ credit:https://stackoverflow.com/a/1987928/1438029


    Clarification:

    grep -r "texthere" / (递归grep all 目录和子目录)

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

    grep递归

    grep [options] PATTERN [FILE ...] [options] -R,-r, - recursive递归读取每个目录下的所有文件 . 这相当于-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
    

    替代品

    ackhttp://beyondgrep.com/

    aghttp://github.com/ggreer/the_silver_searcher

  • -2

    要查找 files 的名称,其中 path 递归地包含 UNIX 的特定 string 使用以下命令:

    find . | xargs grep "searched-string"
    

    Linux

    grep -r "searched-string" .
    

    UNIX 服务器上找到一个文件

    find . -type f -name file_name
    

    在LINUX服务器上找到一个文件

    find . -name file_name
    
  • 10
    grep -r "texthere" .
    

    第一个参数表示要搜索的正则表达式,而第二个参数表示应搜索的目录 . 在这种情况下, . 表示当前目录 .

    注意:这适用于GNU grep,在Solaris等某些平台上,您必须专门使用GNU grep而不是遗留实现 . 对于Solaris,这是 ggrep 命令 .

  • 3

    globbing **

    使用 grep -r 有效,但它可能过度,特别是在大文件夹中 .

    有关更实际的用法,以下是使用globbing syntax** )的语法:

    grep "texthere" **/*.txt
    

    只使用模式选择模式来抓取特定文件 . 它适用于支持的shell,如Bash 4或zsh .

    要激活此功能,请运行: shopt -s globstar .

    另见:How do I find all files containing specific text on Linux?

    git grep

    对于Git版本控制下的项目,请使用:

    git grep "pattern"
    

    哪个更快 .

    ripgrep

    对于较大的项目,最快的grepping工具是ripgrep,默认情况下递归greps文件:

    rg "pattern" .
    

    它 Build 在Rust's regex engine之上,它使用有限自动机,SIMD和积极的文字优化来快速搜索 . 检查detailed analysis here .

  • 8

    只是为了好玩,如果@christangrant答案太多而无法输入,请快速搜索* .txt文件:-)

    grep -r texthere .|grep .txt

  • 89

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

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

    这将在文件中打印出路径/文件名和相对行号,如:

    ./inc/xxxx_x.h

    2865:/ **描述:stringYouWannaFind * /

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

  • 9

    这是一个递归(轻轻地用bash和sh测试)函数,它遍历给定文件夹($ 1)的所有子文件夹,并使用 grep 搜索给定文件中的给定字符串($ 3)($ 2):

    $ 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
    
  • 1

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

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

    请注意 -l (L的小写)显示包含文本的文件的名称 . 如果您想打印匹配本身,请将其删除 . 或者使用 -H 将文件与匹配一起获取 . 总之,其他替代方案是:

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

    -n 打印行号 .

  • 112
    The syntax is:
    cd /path/to/dir
    grep -r <"serch_word name"> .
    

相关问题