我试图遍历目录中的每个文件(包括其子目录中的文件),并在文件满足if条件时执行一些操作。
我的部分代码如下:
for f in $direc/*
do
if grep -q 'search_term' $f; then
#action on this file
fi
done
但是,对于子目录,此操作将失败。如果有人可以帮助我,我将不胜感激。
谢谢!
答案 0 :(得分:0)
grep的emr-5.19.0
选项将读取目录树中的所有文件,包括子目录。结合使用-R
选项仅打印匹配的文件名,您可以使用它对每个匹配的文件执行操作。
-l
例如,这将打印文件名并将文件移动到其他目录。
答案 1 :(得分:0)
查找| xargs是我常用的模式,如果您使用find的-print0选项,它的优点是不会挂在文件名(空格等)中的特殊字符上。
find . -type f -print0 | xargs -0 -I{} sh -c "if grep -q 'search string' '{}'; then cmd-to-run '{}'; fi"
答案 2 :(得分:0)
是的,因为使用这种语法,grep
希望处理文件而不是目录。对脚本的最小更改是测试$f
是否是文件:
...
if [ -f "$f" ] && grep -q 'search_term' $f; then
...
实际上,您可能希望获取具有模式匹配的文件列表并对其进行操作:
while read f; do
: #action on file file $f
done < <(grep -rl 'search_term' $direc/)
我选择通过<(list)
获取文件列表,因为将其管道传输到while
会导致循环内部在另一个进程中运行(特别是可能出现问题)如果您希望可以从外部访问任何变量(更改),并且与``
的简单操作不同,它对遇到的文件名并不那么敏感(即,我有空格,尽管如此,但换行符还是很容易混淆) )。说到:
while read -d "" f; do
: #action on file file $f
done < <(grep -rZl 'search_term' $direc/)
没有什么可以混淆的,因为条目是用空字符分隔的,并且一个文件名中一定不能出现。
答案 3 :(得分:0)
假设文件名中没有换行符:
find "$direc" -type f -exec grep -q 'search_term' {} \; -print |
while IFS= read -r f; do
#action on this file
done