텍스트 문자열이없는 모든 파일을 어떻게 찾을 수 있습니까?


40

텍스트 문자열이없는 모든 파일을 찾기 위해 어떤 간결한 명령을 사용할 수 있습니까?

운이없이 이것을 시도했습니다 (-v를 사용하여 grep의 매개 변수를 반전 시키십시오).

find . -exec grep -v -l shared.php {} \;

누군가 이것이 효과가 있다고 말했다.

find . ! -exec grep -l shared.php {} \;

그러나 그것은 나를 위해 작동하지 않는 것 같습니다.

이 페이지 에는 다음 예제가 있습니다.

find ./logs -size +1c  > t._tmp
while read filename
do
     grep -q "Process Complete" $filename
     if [ $? -ne 0 ] ; then
             echo $filename
     fi
done < t._tmp
rm -f t_tmp

그러나 그것은 번거롭고 전혀 간결하지 않습니다.

추신 : 나는 이것이 가능하다는 것을 알고 grep -L *있지만 grep과 함께 find 명령을 제외 된 파일에 어떻게 사용할 수 있는지 알고 싶습니다.

추신 : 또한 grep에 하위 디렉토리를 grep -L *구문에 포함시키는 방법을 모르겠지만 여전히 사용하는 방법을 알고 싶습니다 find:)


1
당신이 쓴 첫 번째 명령은 내 컴퓨터에서 잘 작동했습니다. 어떤 버전의 찾기를 사용하고 있습니까? 그리고 우리가 그것을 가지고 있기 때문에, 당신이 실행중인 유닉스를 지정할 수 있습니다 ..
rahmu

@rahmu,이 명령 은 거의 항상 예상대로 작동하지 않습니다. 당신은 아마도 매우 구체적인 사건을 겪었을 것입니다. unix.stackexchange.com/questions/339619/…를
sgnsajgon

답변:


8
find . -type f | xargs grep -H -c 'shared.php' | grep 0$ | cut -d':' -f1    

또는

find . -type f -exec grep -H -c 'shared.php' {} \; | grep 0$ | cut -d':' -f1

여기서 -c카운트가 0이고 필요한 파일 인 경우 파일에서 일치하는 줄 수를 계산하여 (을 사용하여 ) 출력에서 ​​첫 번째 열 즉 파일 이름을 잘라냅니다.


6
이것은 매우 복잡합니다. Kevin의 답변을 참조하십시오 .
Gilles 'SO- 악의를 멈춰라'

@Gilles 네 동의합니다. 그의 대답은 +1입니다.
Sachin Divekar

6
이것은 "아주 복잡"할뿐만 아니라 패턴과 일치하는 10 줄의 배수를 포함하는 모든 파일을 나열하기 때문에 잘못 되었습니다. 즉이 경우에도 grep이 여전히 파일을 포함하는 이름을 생각하지 않을 것이다 고정 :또는 개행 문자를 ...
don_crissti

@don_crissti, 언급 해 주셔서 감사합니다! 여전히 많은 복사-붙여 넣기 코드를 사용하지 않으면 위의 해결책은 아주 좋은 특수 효과입니다.
Ufos

@ Ufos-당신의 의견을 정말로 얻지 못합니다 ... 이것은 잘못되었습니다 . 어쨌든 "정말 좋은 특수 효과"처럼
보이면 자유롭게 사용

56

-v -l(줄이 일치하지 않는 -L파일 )을 (줄이 일치하지 않는 파일 )로 변경하면 찾기가 작동 하지만 grep재귀 ( -r) 옵션을 사용할 수도 있습니다 .

grep -rL shared.php .

어느 것이 작동해야합니까?
cwd

@Kevin-죄송합니다 find . -exec grep -v -l shared.php {} \;(및 시도한 다른 모든 변형)가 작동하지 않습니다. 나는 OS X에 있지만 그것이 중요하다고 생각하지 않습니다. -r옵션 에 대해 잊었 기 때문에 +1을주었습니다 .
cwd

@cwd 나는 이것이 오래되었다는 것을 알고 있지만 장래 독자들을 위해 여기에 남겨두고 싶습니다 .OS X에 있다는 사실이 차이를 만듭니다. Mac OSX는 FreeBSD 명령을 사용합니다. 여기에서 대부분의 사람들은 Linux (GNU) 스타일 명령을 가정합니다. 그들은 다른 주장, 세부 사항을 다루는 다른 방법을 가지고 있습니다.
Rich Homolka

2016 년 현재 OSX는 다음을 지원하는 것으로 보입니다-L
David Moles

@ kevin 나는 그것이 아니라고 말했다. :) 아무도 명시 적으로 말하지 않았지만 주석은 혼란 스러웠습니다 (그리고 다른 OS X / BSD 대 GNU 문제에 확실히 빠졌습니다).
David Moles

4

나는 이것이 그렇게 grep -L *할 것이라는 것을 알고 있지만 파일을 제외시키기 위해 find명령을 함께 사용할 수있는 방법은 grep내가 정말로 알고 싶은 것입니다.

당신은 이것을 사용 find하고 grep좋아할 수 있습니다 :

find . -type f ! -exec grep -q 'PATTERN' {} \; -print

다음 -print: 이전 식을 경우에만 실행 ! -exec ... {}으로 평가한다 true.
그래서 각각의 파일을 찾을 들어 grep -q 'PATTERN'있다 exec결과 인 경우, uted false전체 발현 후 ! -exec grep -q 'PATTERN'평가되는 true파일 이름이됩니다 print에드.


2
그것은 표준적이고 휴대용이라는 이점이 있습니다.
Stéphane Chazelas

GNU와는 차이점이 grep -L있지만 목록에 읽을 수없는 파일도 포함됩니다.
Stéphane Chazelas


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.