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

2024-10-10 09:28:00
admin
原创
79
摘要:问题描述:如何递归grep所有目录和子目录?find . | xargs grep "texthere" * 解决方案 1:grep -r "texthere" . 第一个参数表示要搜索的正则表达式,第二个参数表示要搜索的目录。在本例中,...

问题描述:

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

find . | xargs grep "texthere" *

解决方案 1:

grep -r "texthere" .

第一个参数表示要搜索的正则表达式,第二个参数表示要搜索的目录。在本例中,.表示当前目录。

注意:这适用于 GNU grep,在某些平台(如 Solaris)上,您必须专门使用 GNU grep,而不是使用旧实现。对于 Solaris,这是命令ggrep

解决方案 2:

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

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

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

如果您经常搜索代码,Ag(The Silver Searcher)是比 grep 更快的替代品,它是为搜索代码而定制的。例如,它默认是递归的,并自动忽略 中列出的文件和目录.gitignore,因此您不必一直向 grep 或 find 传递同样繁琐的排除选项。

解决方案 3:

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

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

(正如kronen在评论中指出的那样,您可以添加2>/dev/null 到 void permission denied 输出中)

其中包括以下选项:

--include=PATTERN

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

-n, --line-number

在输出的每一行前面加上输入文件中的行号。

(注意:phuclv在评论中添加了会 -n大大降低性能的内容,因此您可能想要跳过该选项)

-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;
...

解决方案 4:

还:

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

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

解决方案 5:

通配符**

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

为了更加实际的用法,这里是使用通配符语法( )的语法**

grep "texthere" **/*.txt

它仅 grep 具有选定模式的特定文件。它适用于受支持的 shell,例如Bash +4zsh

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

另请参阅:如何在 Linux 上查找包含特定文本的所有文件?

git grep

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

git grep "pattern"

这要快得多。

ripgrep

对于较大的项目,最快的 grepping 工具是ripgrep默认以递归方式 grep 文件:

rg "pattern" .

它建立在Rust 的正则表达式引擎之上,该引擎使用有限自动机、SIMD 和积极的文字优化来使搜索非常快。在此处查看详细分析。

解决方案 6:

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

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

Solaris和同意HP-UX

解决方案 7:

在 Linux 系统上的所有文件中递归查找字符串的另一种语法

grep -irn "string"

命令细目

 -r, --recursive

表示recursive在给定的目录和子目录中查找指定的字符串,在文件、二进制文件等中查找特定的字符串

-i, --ignore-case

忽略大小写,可用于添加反转大小写字符串

-n, --line-number

打印找到的文件中指定字符串的行号

注意:这会将大量结果打印到控制台,因此您可能需要通过管道过滤输出并删除不太有趣的信息。它还会搜索二进制程序,因此您可能需要过滤部分结果

解决方案 8:

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

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/

解决方案 9:

files要以path递归方式查找包含特定名称的名称string,请使用以下命令UNIX

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 -l "foo" .

解决方案 11:

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

解决方案 12:

这应该有效:

grep -R "texthere" *

解决方案 13:

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

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

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

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

在哪里-n打印行号。

解决方案 14:

这是在我当前的机器上(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"

解决方案 15:

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

(^来源: https: //stackoverflow.com/a/1987928/1438029)


澄清:

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

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

grep 递归

grep [options] PATTERN [FILE...]

[选项]

-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

解决方案 16:

这是我的看法。正如其他人提到的,grep -r并非在每个平台上都有效。这可能听起来很傻,但我总是使用 git。

git grep "texthere"

即使目录没有暂存,我也只是将其暂存并使用 git grep。

解决方案 17:

以下是在环境中String递归搜索的命令。Unix`Linux`

UNIX命令为:

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

Linux命令为:

grep -r "string to be searched" .

解决方案 18:

在 2018 年,您想使用ripgrep或,the-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

解决方案 19:

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

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

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

./inc/xxxx_x.h

2865:/* 描述:stringYouWannaFind /

无论如何,它对我有用:)

解决方案 20:

可用标志的列表如下:

grep --help 

返回当前目录中与正则表达式文本匹配的所有内容以及相应的行号:

grep -rn "texthere" .

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

grep -rni "texthere" /

此处使用的标志:

  • -r递归

  • -n打印行号并输出

  • -i忽略大小写

解决方案 21:

请注意,find . -type f | xargs grep whatever当 find 匹配的文件太多时,各种解决方案都会遇到“参数列表太长”错误。

最好的选择是,grep -r但如果不可用,find . -type f -exec grep -H whatever {} ;则使用。

解决方案 22:

我想这就是你想写的

grep myText $(find .)

如果你想查找文件 grep hit,这可能还有其他帮助

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

解决方案 23:

这是一个递归函数(使用 bash 和 sh 进行了简单的测试),它遍历给定文件夹 ($1) 的所有子文件夹,并grep在给定文件 ($2) 中搜索给定的字符串 ($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

解决方案 24:

对于 .gz 文件,递归扫描所有文件和目录更改文件类型或输入 *

find . -name *.gz -print0 | xargs -0 zgrep "STRING"

解决方案 25:

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

grep -r texthere .|grep .txt

解决方案 26:

从 grep 命令中获取第一个匹配的文件,并获取所有不包含某些单词的文件,但第二个 grep 的输入文件来自第一个 grep 命令的结果文件。

grep -l -r --include "*.js" "FIRSTWORD" * | xargs grep "SECONDwORD"
grep -l -r --include "*.js" "FIRSTWORD" * | xargs grep -L "SECONDwORD"

dc0fd654-37df-4420-8ba5-6046a9dbe406

grep -l -r --include "*.js" "SEARCHWORD" * | awk -F'/' '{print $NF}' | xargs -I{} sh -c 'echo {}; grep -l -r --include "*.html" -w --include=*.js -e {} *;  echo '''

5319778a-cec2-444d-bcc4-53d33821fedb

grep "SEARCH_STRING" *.log | grep -e "http" -e "https" | awk '{print $NF}' | uniq

ce91d131-a5c2-4cc8-b836-1461feee6cdb

可以按如下方式修改命令以提取 messageName 的值:

grep -m 2 "In sendMessage:: " *LOGFILE.log | grep -o -e "messageName=[^,]*" | cut -d= -f2 | sort | uniq | tee >(echo "Number of unique values: $(wc -l)")

grep "In Message:: " *messaging.log | grep -o -e "messageName=[^,]*" | cut -d= -f2 | sort | uniq | while read -r messageName; do grep -m 1 "In  sendMessage:: .*messageName=${messageName}" *logfile.log | head -n 1; done

我想使用下面的 grep 命令对上述文件 2 进行运行。文件根据其更新时间按降序排列,并且不符合 .gz 格式

grep "org.springframework.batch.item.ItemStreamException: Failed to initialize the reader at" $(ls -lrth | grep -i opti | awk '{print $NF}')
      grep -A 15 "request to URL : SEARCH" $(ls -lth | grep "common" | grep -v ".gz"  | awk '{print $NF}')

命令从第一次出现到最后一次出现创建一个新文件。

sed -n '/14 Jan 2023/,/14 Jan 2023/p' common.log > common_1day.log

今天修改了文件,

ls -lrth $(find . -type f -name "*.log" -newermt "$(date -R -d 'today 00:00')" -print)
grep "CID" $(find . -type f -name "*.log" -newermt "$(date -R -d 'today 00:00')" -print)
zgrep "SEARCH" $(find . -type f -newermt "$(date -R -d 'today 00:00')" -print)
ls -lrth $(find . -type f -name "*" -newermt "$(date -R -d 'today 00:00')" -print)
less +G $(find . -type f -name "*LOG_FILE.log" -newermt "$(date -R -d 'today 00:00')" -print)
grep Async $(find . -type f -name "*" -newermt "2023-04-14 00:00:00" ! -newermt "2023-04-16 00:00:00" -print)

查找命令

find . -type f -not -path "*/target/*" -name "log4j2.xml" -exec grep -H '<Async name="' {} ;

解决方案 27:

在 Solaris 上(以及其他旧的 Unix 系统)

ggrep -r“$你的文本”$目录

相关推荐
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   601  
  华为IPD与传统研发模式的8大差异在快速变化的商业环境中,产品研发模式的选择直接决定了企业的市场响应速度和竞争力。华为作为全球领先的通信技术解决方案供应商,其成功在很大程度上得益于对产品研发模式的持续创新。华为引入并深度定制的集成产品开发(IPD)体系,相较于传统的研发模式,展现出了显著的差异和优势。本文将详细探讨华为...
IPD流程是谁发明的   7  
  如何通过IPD流程缩短产品上市时间?在快速变化的市场环境中,产品上市时间成为企业竞争力的关键因素之一。集成产品开发(IPD, Integrated Product Development)作为一种先进的产品研发管理方法,通过其结构化的流程设计和跨部门协作机制,显著缩短了产品上市时间,提高了市场响应速度。本文将深入探讨如...
华为IPD流程   9  
  在项目管理领域,IPD(Integrated Product Development,集成产品开发)流程图是连接创意、设计与市场成功的桥梁。它不仅是一个视觉工具,更是一种战略思维方式的体现,帮助团队高效协同,确保产品按时、按质、按量推向市场。尽管IPD流程图可能初看之下显得错综复杂,但只需掌握几个关键点,你便能轻松驾驭...
IPD开发流程管理   8  
  在项目管理领域,集成产品开发(IPD)流程被视为提升产品上市速度、增强团队协作与创新能力的重要工具。然而,尽管IPD流程拥有诸多优势,其实施过程中仍可能遭遇多种挑战,导致项目失败。本文旨在深入探讨八个常见的IPD流程失败原因,并提出相应的解决方法,以帮助项目管理者规避风险,确保项目成功。缺乏明确的项目目标与战略对齐IP...
IPD流程图   8  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用