“grep -rn”仅产生两个预期结果之一

“grep -rn”仅产生两个预期结果之一

我试图在目录结构中查找包含特定单词的所有文件,但它无法正常工作。

  • 例如:当从路径运行时/Institute/IITDhanbad/,命令
    grep -rn "Programmer" *
    
    结果为
    BTECH/CompScience.txt:22:    Sudip is a Programmer
    
  • 但是,当从 path 运行时/Institute/IITDhanbad/MTECH,相同的命令给出
    CSP/Boys/Good/Electronics.txt:13:    Sourav is a Programmer
    

问题是,在文件夹grep中运行调用时的预期结果/Institute/IITDhanbad/两个都结果,即

BTECH/CompScience.txt:22:               Sudip is a Programmer
MTECH/CSP/Boys/Good/Electronics.txt:13: Sourav is a Programmer

出了什么问题以及如何解决这个问题?

一些附加信息:

  • 文件类型和访问权限是:

    文件 模式
    MTECH drwxrwsr-x
    BTECH drwxrwsr-x
    CSP lrwxrwxrwx
  • ls -ld/Institute/IITDhanbad/路径中:

    drwxrwsr-x 4 suresh faculty 4096 Sep 16 00:53
    
  • ls -ld/Institute/IITDhanbad/MTECH路径中:

    drwxrwsr-x 4 suresh faculty 4096 Sep 16 00:53
    
  • ls -ld/Institute/IITDhanbad/MTECH/CSP路径中:

    dr-xr-sr-t 4 ganesh faculty 4096 Sep 12 20:58 .
    

答案1

CSP是一个符号链接(参见llrwxrwxrwx。显然,除了作为参数提供的符号链接之外,您grep不遵循 的符号链接。-r当你这样做时:

grep -rn "Programmer" *

在 的父目录中CSP(即在 中/Institute/IITDhanbad/MTECH/,对吧?),CSP在 shell 展开后作为参数出现*。但是,如果您在“更高”的目录(在/Institute/IITDhanbad/)中执行此操作,则CSP不是一个参数,它是在grep递归扫描期间遇到的符号链接。

GNUgrep就是这样工作的。你的是grepGNU吗grep?如果是这样,请参阅 的手册-R-R就像-r但是它遵循符号链接。

请注意,如果您grep -rn "Programmer" .在 的父目录中执行了操作,CSPCSP不会作为参数出现。的使用*对于您所观察到的结果至关重要。

答案2

回答

GNU grep 手册声明该选项-r仅遵循直接符号链接(命令行上给出的符号链接),而不是目录层次结构中更远的符号链接:

-r
--递归
对于每个目录操作数,递归地读取并处理该目录中的所有文件。遵循命令行上的符号链接,但跳过递归遇到的符号链接。请注意,如果未给出文件操作数,grep 将搜索工作目录。这与“--directories=recurse”选项相同

因此,目录 CSP 作为直接给定目录 MTECH 内的符号链接,在搜索给定文本时不会被遍历。

注意:在澄清问题之前,之前的回答:

问题的可能原因

子目录 MTECH 无法设置执行权限位。例如:

$ mkdir -p one/two
$ cd one
$ cat <<EOT > test.txt
abc def
EOT
$ cp test.txt two
$ grep -rn def *
test.txt:1:abc def
two/test.txt:1:abc def
$ chmod -x two
$ grep -rn def *
test.txt:1:abc def
grep: two/test.txt: Permission denied

诚然,这会在 stderr 上给出错误消息。但是,如果grep 设置为别名/usr/bin/grep -s

$ alias grep='/usr/bin/grep -s'
$ grep -rn def *
test.txt:1:abc def

这可能是拼图的最后一块。

解决方案

unalias grep在运行 grep 之前使用,或者使用/usr/bin/grep而不只是grep.

答案3

您可以通过简单地执行 cmd 来简化您的方法:

target_dir="/path/to/directory/of/interest"
[ -d "$target_dir"  ] && grep -rn -e "Programmer" "$target_dir"

或与您尝试过的类似,但包括对文件操作数作为目录的测试:

target_dir="/path/to/directory/of/interest"
[ -d "$target_dir"  ] && cd "$target_dir" && grep -rn -e "Programmer"

-r使用不提供文件操作数的递归 () 与从下递归相同的事实$PWD

这就是你所要求的吗?

相关内容