如何递归grep
所有目录和子目录?
find . | xargs grep "texthere" *
grep -rin xlsx *.pl
在Redhat Linux上对我不起作用。我收到“不匹配”错误。
如何递归grep
所有目录和子目录?
find . | xargs grep "texthere" *
grep -rin xlsx *.pl
在Redhat Linux上对我不起作用。我收到“不匹配”错误。
Answers:
grep -r "texthere" .
第一个参数表示要搜索的正则表达式,而第二个参数表示应搜索的目录。在这种情况下,.
表示当前目录。
注意:这适用于GNU grep,在某些平台(如Solaris)上,必须专门使用GNU grep而不是传统实现。对于Solaris,这是ggrep
命令。
AIX 5.3
。
如果知道所需的文件扩展名或格式,则另一种方法是使用--include
option:
grep -r --include "*.txt" texthere .
您也可以使用提及要排除的文件--exclude
。
如果您经常搜索代码,那么Ag(白银搜索器)是grep的更快选择,它是为搜索代码而定制的。例如,默认情况下它是递归的,并且会自动忽略中列出的文件和目录.gitignore
,因此您不必一直将相同的繁琐排除选项传递给grep或find。
=
在Ubuntu上很好用。PS:那应该是一个空白,但是SO Markdown解析器失败了。
grep
Ag,请注意:)
--include "*.txt" --include "*.TXT"
也:
find ./ -type f -print0 | xargs -0 grep "foo"
但这grep -r
是一个更好的答案。
find . -type f -exec grep "foo" '{}' \;
在受支持的地方效果很好。
find ./ -type f -print0 | xargs -0 grep "foo"
我现在总是使用(即使在带有GoW的 Windows上-Windows上的Gnu):
grep --include="*.xxx" -nRHI "my Text to grep" *
其中包括以下选项:
--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;
...
-R
选项而递归地)应用于文件夹。
在POSIX系统中,找不到的-r
参数,grep
并且grep -rn "stuff" .
不会运行,但是如果使用find
命令,它将:
find . -type f -exec grep -n "stuff" {} \; -print
商定Solaris
和HP-UX
。
-exec
option中-symbol {}
是对find
工具当前找到的文件名的引用(即对我们找到的文件名进行处理),-exec
option 也应该以;
symbol 终止(以标记exec命令的结尾),但是因为这就是全部在shell中运行时,应将符号转义..最后,-print
选项允许find
工具在屏幕上打印出找到的文件名。
**
使用grep -r
有效,但可能会过大,尤其是在大文件夹中。
grep "texthere" **/*.txt
仅抓取具有选定图案的图案的特定文件。它适用于受支持的shell,例如Bash +4或zsh。
要激活此功能,请运行:shopt -s globstar
。
git grep
对于受Git版本控制的项目,请使用:
git grep "pattern"
这要快得多。
ripgrep
对于大型项目,最快的ripgrep
grepping 工具是默认情况下以递归方式处理文件:
rg "pattern" .
它基于Rust的正则表达式引擎构建,该引擎使用有限自动机,SIMD和积极的文字优化来使搜索变得非常快。在此处检查详细分析。
要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
如果您只想遵循实际目录,而不是符号链接,
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" .
如果您想在目录中找到所有提及猫这个词
/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/
现在,ag是我最喜欢的方法,github.com/ggreer/the_silver_searcher。它与ack基本相同,但还有更多优化。
这是一个简短的基准。我会在每次测试之前清除缓存(请参阅/ubuntu/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
这应该工作:
grep -R "texthere" *
如果要从目录结构中查找所有文件中的特定内容,则可以使用find
它,因为这样可以更清楚地了解正在执行的操作:
find -type f -exec grep -l "texthere" {} +
请注意-l
(L的小写字母)显示了包含文本的文件的名称。如果您要打印匹配项本身,则将其删除。或用于-H
将文件与匹配项一起获取。总之,其他替代方法是:
find -type f -exec grep -Hn "texthere" {} +
在哪里-n
打印行号。
find
既避免不必要使用的解决方案xargs
和使用+
,而不是\;
用-exec
,从而避免不必要吨进程启动的。:-)
这是在我当前的机器上工作的案例(在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"
grep -r "texthere" .
(通知期末)
(^贷方:https : //stackoverflow.com/a/1987928/1438029)
澄清:
grep -r "texthere" /
(递归grep 所有目录和子目录)
grep -r "texthere" .
(递归grep 这些目录和子目录)
grep [options] PATTERN [FILE...]
[选项]
-R, -r, --recursive
递归读取每个目录下的所有文件。
这等效于
-d recurse
或--directories=recurse
选项。
$ grep --help
$ grep --help |grep recursive
-r, --recursive like --directories=recurse
-R, --dereference-recursive
在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
。
rg
与从头开始将递归grep命令整合在一起也具有相当大的优势。使用rg
:rg foo
。使用UNIX工具:find . | xargs grep foo
。并且,如果您的任何文件中都带有引号,则需要使用find . -print0 | xargs -0 grep foo
。您是否还记得如果一年使用几次呢?
find . -type f -exec grep 'regex' {} +
,如果定期使用这些工具,哪一个确实容易记住。但是,如果您需要经常查找内容,则无论如何应该运行ctags
或etags
在源代码树上运行。
以下是用于String
递归搜索Unix
和Linux
环境的命令。
用于UNIX
命令是:
find . -name "string to be searched" -exec grep "text" "{}" \;
用于Linux
命令是:
grep -r "string to be searched" .
注意 find . -type f | xargs grep whatever
当find匹配的文件过多时各种解决方案都将遇到“ Argument list to long”错误。
最好的选择是,grep -r
但如果无法使用,请find . -type f -exec grep -H whatever {} \;
改用。
xargs
是“参数列表过长”问题的专门解决方法。
find . -type f | xargs -L 100 grep whatever
xargs
已标准化,可以立即使用。“ xargs
实用程序应限制命令行的长度,以使在调用命令行时,组合的参数和环境列表……不得超过{ARG_MAX} -2048字节。”
这是一个递归函数(使用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