grep -R(大写)和 -r(小写)的区别

Mag*_*nus 4 command-line grep

如果我进入/etc/apache2/并输入,grep -rl 'LoadModule php' ./*那么我只会看到./mods-available/php7.0.load. 如果我r改为R然后我会看到

./mods-available/php7.0.load
./mods-enabled/php7.0.load
Run Code Online (Sandbox Code Playgroud)

这两个都是普通目录。我希望-r让 grep 递归 PWD 中的所有文件/目录。怎么回事-r?我想-R在这一点上总是使用。

Kul*_*lfy 10

根据grep 的联机帮助页

-r, --recursive
               以递归方式读取每个目录下的所有文件,仅当它们位于命令行上时才遵循符号链接。请注意,如果没有给出文件操作数,grep 将搜索工作目录。这等效于 -d 递归选项。

-R, --dereference-recursive 递归
               读取每个目录下的所有文件。与 -r 不同,遵循所有符号链接。

例子:

我有一个文件夹test,其中有一个文件1.txt2.txt是到1.txt的符号链接,这样的输出ls -l test看起来像:

-rw-r--r-- 1 kulfy kulfy 15 Jun 12 21:53 1.txt
lrwxrwxrwx 1 kulfy kulfy  5 Jun 12 21:53 2.txt -> 1.txt
Run Code Online (Sandbox Code Playgroud)

1.txt的内容为:

This is a file.
Run Code Online (Sandbox Code Playgroud)

如果我想在测试文件夹内的文件中搜索“文件”字符串并运行:

grep "file" test
Run Code Online (Sandbox Code Playgroud)

我会遇到一个错误:

grep: test: Is a directory
Run Code Online (Sandbox Code Playgroud)

但如果我这样做:

grep -R "file" test
Run Code Online (Sandbox Code Playgroud)

我得到一个输出:

test/2.txt:This is a file
test/1.txt:This is a file
Run Code Online (Sandbox Code Playgroud)

另一方面,如果我运行:

grep -r "file" test
Run Code Online (Sandbox Code Playgroud)

我得到输出:

test/1.txt:This is a file
Run Code Online (Sandbox Code Playgroud)

在这里,我没有明确提到要扫描所有文件。因此,当我使用R标志时,符号链接(此处为2.txt)受到尊重并生成输出。但是当我使用rflag 时,符号链接被忽略了,因为我没有提到也扫描2.txt


Pab*_*chi 5

从 GNU grep v2.11-8 及更高版本开始如果使用-r 排除在命令行中指定的符号链接进行调用,并在使用-R( source )调用时包含它们。

手册页 ( man grep)

-r,--recursive 递归读取每个目录下的所有文件,仅当它们在命令行上时才遵循符号链接。请注意,如果没有给出文件操作数,grep 将搜索工作目录。这等效于 -d 递归选项。

-R,--dereference-recursive 递归读取每个目录下的所有文件。遵循所有符号链接,-r.