여러 문자열을 포함하는 파일 이름 인쇄

여러 문자열을 포함하는 파일 이름 인쇄

확장자 에 여러 줄이 포함된 파일이 여러 개 있다고 가정해 보겠습니다 .ext. kwd1, kwd2및 3개의 키워드가 모두 포함된 파일 이름을 인쇄해야 합니다 kwd3.

어떻게 해야 합니까?

답변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

-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

관련 정보