在 man 手册中:
-r 递归地读取每个目录下的所有文件,在命令行上只有符号链接才会被跟随。
那么“在命令行上”的确切意思是什么呢?
谢谢。
-r 递归地读取每个目录下的所有文件,在命令行上只有符号链接才会被跟随。
那么“在命令行上”的确切意思是什么呢?
谢谢。
"在命令行上" 指的是传递给 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 .
还会在父目录中搜索文件(跟随在遍历当前目录时发现的符号链接,但不是作为参数给出的符号链接)。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