확장자 에 여러 줄이 포함된 파일이 여러 개 있다고 가정해 보겠습니다 .ext
. kwd1
, kwd2
및 3개의 키워드가 모두 포함된 파일 이름을 인쇄해야 합니다 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
명명된 배열을 지원하는 셸에서 마지막 코드 부분은 다음과 같습니다.
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