假设我有多个文件,其.ext
扩展名包含多行。我需要打印包含所有 3 个关键字的文件名:kwd1
、kwd2
和kwd3
。
我该怎么做?
答案1
要查找当前目录中或以下任意位置以、和.ext
三个关键字结尾并包含这三个关键字的所有文件名:kwd1
kwd2
kwd3
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
我在这里使用-wF
with仅对文件中的整个单词 ()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