하나의 문자열은 포함하고 다른 문자열은 포함하지 않는 파일 찾기

하나의 문자열은 포함하고 다른 문자열은 포함하지 않는 파일 찾기

나는 많은 파일이 있는 폴더에 있습니다 . 파일을 포함하고 있지만 포함하지 않은 .txt모든 파일을 찾고 싶습니다 (반드시 같은 줄에 있을 필요는 없음). 이 작업을 수행하는 방법을 아는 사람이 있나요?stringAstringB

답변1

$IFS파일 이름에 공백, 탭, 개행(수정되지 않은 것으로 가정 ) 또는 와일드카드 문자가 포함되지 않고 로 시작하지 않는 한 -, 해당 옵션을 grep지원 하는 경우 -L다음과 같이 수행할 수 있습니다.

$ cat file1
stringA
stringC
$ cat file2
stringA
stringB
$ grep -L stringB $(grep -l stringA file?)
file1

grep서브쉘에서 실행 되면 $(). 이 파일 목록 은 포함되지 않은 모든 파일을 나열하는 stringA기본 명령에 대한 입력입니다 .grepstringB

에서man grep

  -v, --invert-match
          Invert the sense of matching, to select non-matching lines.  (-v is specified by POSIX.)
  -L, --files-without-match
          Suppress normal output; instead print the name of each input file from which no output would normally have been printed.  The scanning will stop on the first match.
  -l, --files-with-matches
          Suppress normal output; instead print the name of each input file from which output would normally have been printed.  The scanning will stop on the first match.  (-l is specified by POSIX.)

답변2

GNU 도구 사용:

grep -lZ stringA ./*.txt |
  xargs -r0 grep -L stringB

-L, -Z, -r-0때때로 GNU 확장이지만 일부 다른 구현에서는 항상 발견되는 것은 아닙니다.

답변3

#run loop for each file in the directory
for i in `ls -l | tail -n+2 | awk '{print $NF}'` ; do
   #check if file contains "string B" 
   #if true then filename is not printed
   if [[ `egrep "string B" $i | wc -l` -eq 0 ]] ; then
      #check if file contains "string A"
      #if false then file name is not printed
      if [[ `egrep "string A" $i | wc -l` -gt 0 ]] ; then
         #file name is printed only if "string A" is present and "string B" is absent
         echo $i
      fi
   fi
done

Bernhard의 답변을 확인한 후 :

grep -Le "string B" $(grep -le "string A" `ls`)

파일 이름에 공백이 포함된 경우:

grep -L stringB $(grep -l stringA `ls -l | tail -n+2 | awk '{print $NF}' | sed -e 's/\s/\\ /g'`

관련 정보