逐一搜索目录(和任何子目录)中的每个文件

时间:2019-01-23 20:10:34

标签: linux bash grep

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

我的部分代码如下:

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

但是,对于子目录,此操作将失败。如果有人可以帮助我,我将不胜感激。

谢谢!

4 个答案:

答案 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