grep -r和-R之间的区别是什么

时间:2014-03-31 13:59:28

标签: grep

在手册页中:

  

-r

     

以符号形式递归读取每个目录下的所有文件   仅当它们在命令行上时才链接。

“在命令行上”究竟是什么意思?

感谢。

2 个答案:

答案 0 :(得分:4)

如果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此目录中的文件
  • grep -r foobar foo将grep父目录(..)中的文件(在命令行上给出符号链接),
  • grep -R foobar .也将grep父目录中的文件(在命令行上给出符号链接 not ,但在遍历时找到)。

答案 1 :(得分:2)

如果您还查看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