주어진 문자열 패턴을 포함하지 않는 파일은 어떻게 찾습니까?
현재 디렉토리 에서 단어를 포함 하지 않는 파일 을 어떻게 찾 습니까 (사용 )?foo
grep
grep에 -L
(또는 --files-without-match
) 옵션이있는 경우 :
$ grep -L "foo" *
를보십시오 ack
. .svn
자동으로 제외를 수행하고 Perl 정규 표현식을 제공하며 단일 Perl 프로그램의 간단한 다운로드입니다.
찾고있는 것과 동등한 것은 다음과 같습니다 ack
.
ack -L foo
다음 명령은 패턴을 포함하지 않는 모든 파일을 제공합니다 foo
.
find . -not -ipath '.*svn*' -exec grep -H -E -o -c "foo" {} \; | grep 0
다음 명령은 찾기를 svn
사용하여 폴더 를 필터링하지 않아도됩니다 grep
.
grep -rL "foo" ./* | grep -v "\.svn"
실제로 다음이 필요합니다.
find . -not -ipath '.*svn*' -exec grep -H -E -o -c "foo" {} \; | grep :0\$
나는 행운을 빕니다
grep -H -E -o -c "foo" */*/*.ext | grep ext:0
내 시도는 grep -v
그냥 "foo"없이 모든 줄을 주었다.
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
문제
.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 옵션이 없습니다. 나는 이것을 달성하기위한 해결 방법을 찾습니다.
아이디어는 다음과 같습니다.
- serv1 문자열을 포함하는 모든 파일 이름을 txt1.txt로 덤프합니다.
- 디렉토리의 모든 파일 이름을 txt2.txt로 덤프하십시오.
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 ">"
find *20161109* -mtime -2|grep -vwE "(TRIGGER)"
"find"에서 필터를 지정하고 "grep -vwE"에서 제외 문자열을 지정할 수 있습니다. 수정 된 시간을 필터링해야하는 경우 찾기에서 mtime을 사용하십시오.
버그 리포트 열기
@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
grep -irnw "filepath" -ve "pattern"
또는
grep -ve "pattern" < file
위의 명령은 -v가 검색되는 패턴의 역수를 찾으면 결과를 제공합니다.
다음 명령은 하위 문자열 "foo"를 포함하는 행을 필터링하는 데 도움이 될 수 있습니다.
cat file | grep -v "foo"
'Programing' 카테고리의 다른 글
자바 스크립트 : Class.method vs. Class.prototype.method (0) | 2020.02.14 |
---|---|
R 세션에서 사용 가능한 메모리를 관리하기위한 요령 (0) | 2020.02.14 |
토큰 기반 인증이란 무엇입니까? (0) | 2020.02.14 |
Git으로 커밋을 일부 따기 (0) | 2020.02.14 |
Unix 쉘 스크립트에 환경 변수가 설정되어 있는지 확인하는 간결한 방법은 무엇입니까? (0) | 2020.02.14 |