打印包含多个字符串的文件名

打印包含多个字符串的文件名

假设我有多个文件,其.ext扩展名包含多行。我需要打印包含所有 3 个关键字的文件名:kwd1kwd2kwd3

我该怎么做?

答案1

要查找当前目录中或以下任意位置以、和.ext三个关键字结尾并包含这三个关键字的所有文件名:kwd1kwd2kwd3

find . -name '*.ext' -name '*kwd1*' -name '*kwd2*' -name '*kwd3*'

或者,以更动态的方式设置关键字,

set -- "kwd1" "kwd2" "kwd3"

for word do
    set -- "$@" -name "*$word*"
    shift
done

find . -name "*.ext" "$@" -print

或者,如果您想搜索文件中的关键字:

set -- "kwd1" "kwd2" "kwd3"

for word do
    set -- "$@" -exec grep -q -wF -e "$word" {} ';'
    shift
done

find . -name "*.ext" "$@" -print

我在这里使用-wFwith仅对文件中的整个单词 ()grep进行字符串比较 ( )。-F-w

在支持命名数组的 shell 中,最后一段代码可能如下所示

keywords=( "kwd1" "kwd2" "kwd3" )

and_expr=()
for word in "${keywords[@]}"; do
    and_expr+=( -exec grep -q -wF -e "$word" {} ';' )
done

find . -name "*.ext" "${and_expr[@]}" -print

答案2

使用

find . -type f -name "*.ext" -exec grep -q kwd1 {} \; -exec grep -q kwd2 {} \; -exec grep -l kwd3 {} \;

答案3

使用递归 grep 并读取:

grep --include '*.ext' -lr 'kwd1' . | 
while read -r file; do grep -m1 -q 'kwd2' "$file" && grep -m1 -l 'kwd3' "$file"; done

grep --include '*.ext' -lr 'kwd1' .- 将(递归地)查找当前目录中以.ext并包含以下内容结尾的所有文件kwd1

while 循环将获取每个包含kwd1并确认它也包含kwd2和 的文件kwd3

注意:这将破坏包含换行符的文件名。

答案4

我用下面的方法进行了测试,效果很好:

for i in file file2...filen; do grep "kwd1" $i; if [[ $? == 0 ]]; then grep "kwd2" $i; if [[ $? == 0 ]]; then grep "kwd3" $i; if [[ $? == 0 ]]; then echo "file is $i"; fi; fi; fi; done

相关内容