저는 .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'`