bash
脚本,该脚本在指定目录树中的文件内容中搜索是否存在指定的子字符串。仅使用grep
的递归函数是不够的,因为我潜在地需要遍历系统的/
目录(和所有子目录),这将grep
导致内存不足并中止。因此,我决定使用指定find
了传递给脚本的参数的以下变量来获取指定目录树中所有目录和子目录的列表。
searchdir=$HOME # passed in a script argument
searchstr="secret" # passed in a script argument
我调用该find
实用程序并将输出存储到一个临时文件中。
TF=$(mktemp)
find ${searchdir} -type d 1>$TF 2>/dev/null
使用临时文件中所有目录的列表,我继续使用循环来遍历此文件的各行,while-do
目的是对每个目录中的所有文件进行搜索。对于grep
,我使用此答案中提供的参数格式在单个目录中搜索所有文件,包括隐藏文件。
cat $TF | while read line || [[ -n $line ]];
do
grepdir="${line}/{*,.*}"
grep -sHn "${searchstr}" ${grepdir}
done
...但是,该代码不产生任何输出。
该${TF}
确实包含所有目录的正确列表。输出${grepdir}
变量将提供我期望找到的输出。
/home/user/{*,.*}
/home/user/.ssh/{*,.*}
/home/user/test/{*,.*}
# ... and so on
如果我grep
使用硬编码目录(尤其是该~/test/
目录)运行命令,则该目录包含两个应该带有字符串的测试文件
grep -sHn "${searchstr}" /home/user/test/{*,.*}
...它正确地输出了两个包含子字符串“ secret”的文件。
/home/user/test/asdf:7:secret
/home/user/test/test.txt:5:asdfasfdsecretaasdfafd
一种对我有用的grep
格式是答案中最初提到的一种格式,该格式讨论了递归使用。如果我这样做:
cat $TF | while read line || [[ -n $line ]];
do
grep -rn "${line}" -e "${searchstr}"
done
...我得到一些输出(技术上正确,但是有很多重复的条目),但是由于grep
会递归处理目录,并且我拥有所有目录的列表,因此我必然会多次获得相同的结果,例如前面提到的根目录grep
将完全失败,这就是我要避免的事情。
我可能还应该提到,我拼命地使它运行的技巧(例如作为$(echo "${grepdir}")
参数传递)也没有导致任何结果。
我的思想或理解极有可能是一个误解bash
。在调用之前不应该bash
扩展${grepdir}
变量grep
吗?我的脚本哪里出问题了?
规则1:当命令或脚本没有执行您想要的操作时,请查看错误消息。 不要把它们扔进去 /dev/null
。
您收到类似的错误消息
grep: /home/user/{*,.*}: No such file or directory
grep: /home/user/.ssh/{*,.*}: No such file or directory
grep: /home/user/test/{*,.*}: No such file or directory
但您没有看到它们。
如果我们看bash(1),我们看到
拆分成单词后,在命令行上执行扩展。进行了七种扩展:大括号扩展,代字号扩展,参数和变量扩展,命令替换,算术扩展,单词拆分和路径名扩展。
扩展的顺序是:大括号扩展;波浪线扩展,参数和变量扩展,算术扩展和命令替换(以从左到右的方式完成);分词 和路径名扩展。
对于您的情况,重要的部分是在可变扩展之前先进行括号扩展。所以,如果你说
grep -sHn "${searchstr}" "${line}"/{*,.*}
然后
"${line}"/*
和"${line}"/.*
,/home/user/*
和/home/user/.*
,然后但是,当你说
grep -sHn "${searchstr}" ${grepdir}
然后
/home/user/{*,.*}
,然后为大括号扩张为时已晚。 grep
寻找一个字面叫的文件/home/user/{*,.*}
。
聚苯乙烯
grep -sHn "${searchstr}" "${line}/{*,.*}"
也不起作用,因为引号会阻止括号扩展和路径名扩展的发生。
PPS您不需要所有大括号;
grep -sHn "$searchstr" "$line"/{*,.*}
会没事的。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句