답변:
grep에 -L
(또는 --files-without-match
) 옵션이있는 경우 :
$ grep -L "foo" *
GREP_OPTIONS='--exclude-dir=.svn --exclude-dir=.git'
: ^)
-rL
대신 사용-L
grep -L 'foo' -- *
을 사용하는 것입니다. 표준은 long 옵션을 취하는 명령 --
이이 시점 이후에 더 이상 옵션이 없음을 나타내는 데 사용 됩니다.
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
다음 명령은 패턴을 포함하지 않는 모든 파일을 제공합니다 foo
.
find . -not -ipath '.*svn*' -exec grep -H -E -o -c "foo" {} \; | grep 0
grep '0$'
10 줄의 배수를 가진 파일도 일치합니다! 줄 grep ':0$'
끝에서 명시적인 ': 0'을 확인하려면 끝에 있어야합니다. 그런 다음 줄이 0 인 파일 만 찾습니다.
문제
.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
내 grep에는 -L 옵션이 없습니다. 나는 이것을 달성하기위한 해결 방법을 찾습니다.
아이디어는 다음과 같습니다.
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
@tukan이 언급 한 것처럼 -L
/ --files-without-matches
플래그 와 관련하여 Ag에 대한 공개 버그 보고서가 있습니다 .
버그 보고서가 거의 진행 되지 않으므로 버그가 해결되지 않는 -L
한 아래에 언급 된 옵션에 의존해서는 안됩니다 . 이 스레드에서 제시된 다른 접근 방식을 대신 사용하십시오. 버그 리포트에 대한 의견 인용 [emphasis mine] :
이것에 대한 업데이트?
-L
파일의 첫 번째 줄에서 일치하는 것을 완전히 무시합니다. 이것이 곧 고쳐지지 않을 것 같으면 깃발은 완전히 광고 된대로 작동하지 않기 때문에 완전히 제거해야합니다 .
에 대한 강력한 대안으로 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
grep -irnw "filepath" -ve "pattern"
또는
grep -ve "pattern" < file
위의 명령은 -v가 검색되는 패턴의 역수를 찾으면 결과를 제공합니다.
-l
파일 이름 만 인쇄 하는 옵션을 추가 할 수 있습니다 . 그러나 여전히 패턴을 포함하지 않는 행을 포함 하는 파일의 이름을 인쇄합니다 . OP가 패턴을 포함하는 행을 포함하지 않는 파일을 찾으려고 생각합니다.
다음 명령은 하위 문자열 "foo"를 포함하는 행을 필터링하는 데 도움이 될 수 있습니다.
cat file | grep -v "foo"
cat
.