如何递归地 grep 所有目录和子目录?
- 2024-10-10 09:28:00
- admin 原创
- 79
问题描述:
如何递归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 +4或zsh。
要激活此功能,请运行: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
选项。
grep 帮助
$ grep --help
$ grep --help |grep recursive
-r, --recursive like --directories=recurse
-R, --dereference-recursive
替代方案
ag
(http://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 上,这将安装ripgrep
:brew install ripgrep
。这将安装silver-searcher
:brew 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“$你的文本”$目录
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理必备:盘点2024年13款好用的项目管理软件