Programing

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

lottogame 2020. 2. 14. 21:55
반응형

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


현재 디렉토리 에서 단어를 포함 하지 않는 파일어떻게 찾 습니까 (사용 )?foogrep


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 옵션이 없습니다. 나는 이것을 달성하기위한 해결 방법을 찾습니다.

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

  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 ">"
    

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"

참고 URL : https://stackoverflow.com/questions/1748129/how-do-i-find-files-that-do-not-contain-a-given-string-pattern



반응형