주어진 문자열 패턴을 포함하지 않는 파일은 어떻게 찾습니까?


답변:


818

grep에 -L(또는 --files-without-match) 옵션이있는 경우 :

$ grep -L "foo" *

1
다른 곳에서 지적한 것처럼 ack은 기본적으로 .svn (subversion) 파일을 피하는 데 도움이됩니다.
GuruM

11
@GuruM 이것은 GNU grep에서 변수를 내 보내서 수행 할 수 있습니다 GREP_OPTIONS='--exclude-dir=.svn --exclude-dir=.git': ^)
bufh

6
또는 ag를 사용하는 동등한 것 :ag -L 'foo'
주교

5
마술처럼 작동합니다! 힌트 : 하위 디렉토리와 일치 하는 -rL대신 사용-L
Ufos

1
@Larry — globbing 문제를 피하는 더 확실한 방법은 다음과 같이 "empty"long 옵션 grep -L 'foo' -- *을 사용하는 것입니다. 표준은 long 옵션을 취하는 명령 --이이 시점 이후에 더 이상 옵션이 없음을 나타내는 데 사용 됩니다.
Paddy Landau

45

살펴보십시오 ack. .svn자동으로 제외를 수행하고 Perl 정규 표현식을 제공하며 단일 Perl 프로그램의 간단한 다운로드입니다.

찾고있는 것과 동등한 것은 다음과 같습니다 ack.

ack -L foo

23

grep만으로도 찾을 수 있습니다.

grep -riL "foo" .

이것은 사용 된 매개 변수에 대한 설명입니다 grep

     -L, --files-without-match
             each file processed.
     -R, -r, --recursive
             Recursively search subdirectories listed.

     -i, --ignore-case
             Perform case insensitive matching.

l(소문자) 를 사용 하면 반대 (파일이 일치하는 파일)가 표시됩니다

     -l, --files-with-matches
             Only the names of files containing selected lines are written

17

다음 명령은 패턴을 포함하지 않는 모든 파일을 제공합니다 foo.

find .  -not  -ipath '.*svn*' -exec  grep  -H -E -o -c  "foo"  {} \; | grep 0

4
마지막에 grep 0을 grep 0 $로 변경하려고합니다 (그렇지 않으면 파일 이름에 문자가 0 인 파일에서 잘못된 일치를 얻습니다).
clouseau

9
@clouseau가 대부분 맞습니다 ... 그러나 grep '0$'10 줄의 배수를 가진 파일도 일치합니다! 줄 grep ':0$'끝에서 명시적인 ': 0'을 확인하려면 끝에 있어야합니다. 그런 다음 줄이 0 인 파일 만 찾습니다.
TrinitronX

내가 사용하는 UNIX에는 이러한 옵션이 포함 된 find 또는 grep 버전이 없으므로 다른 의견에서 제안한 "ack"명령을 사용해야했습니다.
KC Baltz

14

다음 명령은 찾기를 svn사용하여 폴더 를 필터링하지 않아도됩니다 grep.

grep -rL "foo" ./* | grep -v "\.svn"


6

나는 행운을 빕니다

grep -H -E -o -c "foo" */*/*.ext | grep ext:0

내 시도는 grep -v그냥 "foo"없이 모든 줄을 주었다.


4

문제

.phtml인라인 PHP 코드를 사용하여 HTML을 작성하기 위해 파일을 사용하는 대규모 프로젝트를 리팩터링해야합니다 . 대신 콧수염 템플릿 을 사용하고 싶습니다 . .phtml문자열 new Mustache을 포함하지 않는 giles 를 찾으려면 여전히 다시 작성해야합니다.

해결책

find . -iname '*.phtml' -exec grep -H -E -o -c 'new Mustache' {} \; | grep :0$ | sed 's/..$//'

설명

파이프 전에 :

찾기

find . 이 디렉토리에서 시작하여 재귀 적으로 파일 찾기

-iname '*.phtml' 파일 이름에는 .phtml ( i대소 문자를 구분하지 않음)

-exec 'grep -H -E -o -c 'new Mustache' {}' 실행 grep일치하는 각 경로 명령을

그렙

-H 항상 출력 라인과 함께 파일 이름 헤더를 인쇄하십시오.

-E 패턴을 확장 된 정규 표현식으로 해석하십시오 (예 : grep을 egrep으로 작동하도록 강제하십시오).

-o 줄의 일치하는 부분 만 인쇄합니다.

-c 선택된 라인 수만 표준 출력에 기록됩니다.


이렇게하면으로 끝나는 모든 파일 경로 목록이 표시되며 각 경로 .phtml에서 문자열이 new Mustache발생 하는 횟수를 계산 합니다.

$> find . -iname '*.phtml$' -exec 'grep -H -E -o -c 'new Mustache' {}'\;

./app/MyApp/Customer/View/Account/quickcodemanagestore.phtml:0
./app/MyApp/Customer/View/Account/studio.phtml:0
./app/MyApp/Customer/View/Account/orders.phtml:1
./app/MyApp/Customer/View/Account/banking.phtml:1
./app/MyApp/Customer/View/Account/applycomplete.phtml:1
./app/MyApp/Customer/View/Account/catalogue.phtml:1
./app/MyApp/Customer/View/Account/classadd.phtml:0
./app/MyApp/Customer/View/Account/orders-trade.phtml:0

첫 번째 파이프는 grep :0$이 목록을 필터링하여 다음으로 끝나는 줄만 포함합니다 :0.

$> find . -iname '*.phtml' -exec grep -H -E -o -c 'new Mustache' {} \; | grep :0$

./app/MyApp/Customer/View/Account/quickcodemanagestore.phtml:0
./app/MyApp/Customer/View/Account/studio.phtml:0
./app/MyApp/Customer/View/Account/classadd.phtml:0
./app/MyApp/Customer/View/Account/orders-trade.phtml:0

두 번째 파이프 sed 's/..$//'는 각 행의 마지막 두 문자를 제거하고 파일 경로 만 남겨 둡니다.

$> find . -iname '*.phtml' -exec grep -H -E -o -c 'new Mustache' {} \; | grep :0$ | sed 's/..$//'

./app/MyApp/Customer/View/Account/quickcodemanagestore.phtml
./app/MyApp/Customer/View/Account/studio.phtml
./app/MyApp/Customer/View/Account/classadd.phtml
./app/MyApp/Customer/View/Account/orders-trade.phtml

3

git을 사용하는 경우 모든 추적 파일을 검색합니다.

git grep -L "foo"

** 하위 디렉토리 글 로빙을 설정 한 경우 추적 된 파일의 서브 세트를 검색 할 수 있습니다 ( shopt -s globstar.bashrc 에서이 참조 ).

git grep -L "foo" -- **/*.cpp

1

내 grep에는 -L 옵션이 없습니다. 나는 이것을 달성하기위한 해결 방법을 찾습니다.

아이디어는 다음과 같습니다.

  1. serv1 문자열을 포함하는 모든 파일 이름을 txt1.txt로 덤프합니다.
  2. 디렉토리의 모든 파일 이름을 txt2.txt로 덤프하십시오.
  3. diff 명령으로 2 덤프 파일을 구별하십시오.

    grep 'foo' *.log | cut -c1-14 | uniq > txt1.txt
    grep * *.log | cut -c1-14 | uniq > txt2.txt
    diff txt1.txt txt2.txt | grep ">"
    

명령을 잊어 버렸지 만 파일 이름을 덤프하는 대신 실제로 diff두 개의 출력 스트림 사이 에서 할 수 있습니다 (명령을 괄호로 묶고 어딘가에 꺾쇠 괄호가 있다고 생각합니다). 시스템에서 지원하는 경우 그것은 지원하지 않기 때문에 질문이다grep -L
Dexygen

1

find *20161109* -mtime -2|grep -vwE "(TRIGGER)"

"find"에서 필터를 지정하고 "grep -vwE"에서 제외 문자열을 지정할 수 있습니다. 수정 된 시간을 필터링해야하는 경우 찾기에서 mtime을 사용하십시오.


이것은 문자열이없는 모든 줄을 표시하는 것처럼 보이며 OP는 파일 이름 만 요구합니다.
벤 파머

1

버그 리포트 열기

@tukan이 언급 한 것처럼 -L/ --files-without-matches플래그 와 관련하여 Ag에 대한 공개 버그 보고서가 있습니다 .

버그 보고서가 거의 진행 되지 않으므로 버그가 해결되지 않는 -L한 아래에 언급 된 옵션에 의존해서는 안됩니다 . 이 스레드에서 제시된 다른 접근 방식을 대신 사용하십시오. 버그 리포트에 대한 의견 인용 [emphasis mine] :

이것에 대한 업데이트? -L파일의 첫 번째 줄에서 일치하는 것을 완전히 무시합니다. 이것이 곧 고쳐지지 않을 것 같으면 깃발은 완전히 광고 된대로 작동하지 않기 때문에 완전히 제거해야합니다 .


Silver Searcher-Ag (의도 한 기능-버그 보고서 참조)

에 대한 강력한 대안으로 Silver Searcher-Ag를grep 사용할 수 있습니다 .

속도에 중점을 둔 ack와 유사한 코드 검색 도구입니다.

를 보면 man ag, 우리는 발견 -L또는 --files-without-matches옵션 :

...

OPTIONS
    ...

    -L --files-without-matches
           Only print the names of files that don´t contain matches.

즉, 현재 디렉토리에서 일치하지 않는 파일 을 재귀 적으로 검색 하려면 다음 을 수행하십시오 foo.

ag -L foo

일치하지 않는 파일에 대해서만 현재 디렉토리를 검색하려면 재귀 foo를 지정 --depth=0하십시오.

ag -L foo --depth 0

시간으로 인해이도 실패한 시간 -L- 버그 github.com/ggreer/the_silver_searcher/issues/238
투칸

프롬프트에 @tukan 감사합니다. 답변을 업데이트했습니다. 답변을 삭제하지 않고 버그 관련 정보로 열기를 선택합니다.
dfri

1

grep에 -L 옵션이없는 경우 (예 : IBM AIX) grep과 쉘만있는 다른 대안 :

for file in * ; do grep -q 'my_pattern' $file || echo $file ; done

-4
grep -irnw "filepath" -ve "pattern"

또는

grep -ve "pattern" < file

위의 명령은 -v가 검색되는 패턴의 역수를 찾으면 결과를 제공합니다.


1
패턴이없는 선을 인쇄합니다. -l파일 이름 만 인쇄 하는 옵션을 추가 할 수 있습니다 . 그러나 여전히 패턴을 포함하지 않는 행을 포함 하는 파일의 이름을 인쇄합니다 . OP가 패턴을 포함하는 행을 포함하지 않는 파일을 찾으려고 생각합니다.
tripleee

제공 한 명령은 "pattern"을 포함하지 않는 모든 행과 함께 "filepath"에 파일을 나열합니다.
aprodan

-6

다음 명령은 하위 문자열 "foo"를 포함하는 행을 필터링하는 데 도움이 될 수 있습니다.

cat file | grep -v "foo"

2
이렇게하면 일치하지 않는 파일 이름이 아니라 일치하지 않는 행을 인쇄합니다. 부상을 입히기 위해 쓸모없는 사용cat .
tripleee
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.