2014-03-31 125 views
1

在手册页之间的区别:什么是grep的-r和-R

-r

阅读所有文件的每个目录下,递归,下列符号 链接,只有当他们都在命令线。

“在命令行上”究竟意味着什么?

谢谢。

回答

3

如果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在父目录中的文件(符号链接不是在命令行上给出但遍历时发现)。
2

如果您还man grep检查:

-r,--recursive

阅读每个目录下的所有文件,递归,下列符号 链接,只有当他们是在命令行上。这相当于 -d递归选项。

-R,--dereference递归

阅读所有文件的每个目录下,递归。 遵循所有 符号链接,不像-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