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

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

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

답변1

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

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

grep서브셸에서 실행되면 $()모든 포함이 인쇄됩니다 stringA. 파일 목록은 grep모든 포함이 나열되지 않은 기본 명령에 대한 입력 입니다 stringB.

~에서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'`

관련 정보