grep -r 和 -R 有什么区别?

10
在 man 手册中:
-r 递归地读取每个目录下的所有文件,在命令行上只有符号链接才会被跟随。
那么“在命令行上”的确切意思是什么呢?
谢谢。
2个回答

11

"在命令行上" 指的是传递给 grep 的参数。如果您将符号链接作为 参数 传递给 grep -r,它会跟随它。但是,如果 grep -r遍历 目录时遇到符号链接,则不会跟随它(与会跟随符号链接的 grep -R 相反)。

想象一下,您有一个包含多个文件的目录,其中包括一个包含到..(父目录)的符号链接的文件:

$ ls -la
total 0
drwxr-xr-x 2 aw aw 47 Mar 31 16:05 .
drwxr-xr-x 3 aw aw 27 Mar 31 16:04 ..
-rw-r--r-- 1 aw aw  0 Mar 31 16:05 bar
-rw-r--r-- 1 aw aw  0 Mar 31 16:05 baz
lrwxrwxrwx 1 aw aw  2 Mar 31 16:04 foo -> ..
-rw-r--r-- 1 aw aw  0 Mar 31 16:05 quux
$

那么,

  • grep -r foobar . 仅会在当前目录中搜索文件,
  • grep -r foobar foo 会在父目录(..)中搜索文件(跟随作为参数给出的符号链接),
  • grep -R foobar . 还会在父目录中搜索文件(跟随在遍历当前目录时发现的符号链接,但不是作为参数给出的符号链接)。

5
如果您还检查了 man grep,则可以了解以下信息:

-r,--recursive

递归地读取每个目录下的所有文件,在命令行上只跟随符号链接。这相当于-d recurse选项。

-R,--dereference-recursive

递归地读取每个目录下的所有文件。与 -r 不同的是会跟随所有符号链接。

请参考以下示例:
我们在 /test 中创建一个带有内容的文件。
$ cat /test/a
Ping info
Hello

然后我创建了一个符号链接:

$ ln -s /test/a /test/dir/b

这样就像:

$ ls -l /test/dir
b -> ../a

现在我们要使用grep命令:

$ grep -r Ping /test/dir/*     #does NOT follow the symlink to ../a
a:Ping info

$ grep -R Ping /test/dir/*     #DOES follow the symlink to ../a
a:Ping info
dir/b:Ping info

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接