我试图在目录结构中查找包含特定单词的所有文件,但它无法正常工作。
- 例如:当从路径运行时
/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
是一个符号链接(参见l
)lrwxrwxrwx
。显然,除了作为参数提供的符号链接之外,您grep
不遵循 的符号链接。-r
当你这样做时:
grep -rn "Programmer" *
在 的父目录中CSP
(即在 中/Institute/IITDhanbad/MTECH/
,对吧?),CSP
在 shell 展开后作为参数出现*
。但是,如果您在“更高”的目录(在/Institute/IITDhanbad/
)中执行此操作,则CSP
不是一个参数,它是在grep
递归扫描期间遇到的符号链接。
GNUgrep
就是这样工作的。你的是grep
GNU吗grep
?如果是这样,请参阅 的手册-R
。-R
就像-r
但是它做遵循符号链接。
请注意,如果您grep -rn "Programmer" .
在 的父目录中执行了操作,CSP
则CSP
不会作为参数出现。的使用*
对于您所观察到的结果至关重要。
答案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
。
这就是你所要求的吗?