首页 > 解决方案 > 逐个搜索目录(以及任何子目录)中的每个文件

问题描述

我正在尝试遍历目录中的每个文件(包括其子目录中的文件)并在文件满足 if 条件时执行一些操作。

我的部分代码如下:

for f in $direc/*
do
        if grep -q 'search_term' $f; then
            #action on this file
        fi
done

但是,这在子目录的情况下会失败。如果有人可以帮助我,我将不胜感激。

谢谢!

标签: linuxbashgrep

解决方案


是的,因为使用这种语法,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会导致循环内部在另一个进程中运行(这可能是一个问题,特别是如果您希望可以从外部访问任何变量(更改) . 并且不像 simple for with``它对你遇到的文件名不那么敏感(即我有空格,但这仍然会被换行符混淆)。说到这:

while read -d "" f; do
    : #action on file file $f
done < <(grep -rZl 'search_term' $direc/)

没有什么可以混淆这一点,因为条目是由 nul 字符分隔的,并且不能出现在文件名中。


推荐阅读