와일드 카드로 원하는 파일 이름을 재귀 적으로 필터링하는 방법은 무엇입니까?


40

현재 디렉토리에서 재귀 grep 검색을 수행하려고 할 때 일반적으로 다음을 수행합니다.

grep -ir "string" .

그러나이 명령은 이진 파일 (그림, 오디오, 비디오 등)을 포함하여 모든 종류의 파일 내부를 검색하므로 검색 프로세스가 매우 느려집니다.

예를 들어이 작업을 수행하면 작동하지 않습니다.

grep -ir "string" *.php

현재 디렉토리에는 PHP 파일이 없지만 현재 디렉토리의 일부 서브 디렉토리 안에 있으며 하위 디렉토리 이름은 ".php"로 끝나지 않으므로 grep은 그 내부를 찾지 않습니다.

그렇다면 현재 디렉토리에서 재귀 검색을 수행하고 파일 이름 와일드 카드를 지정하려면 어떻게해야합니까? (예 : 특정 확장자로 끝나는 파일 만 검색)

답변:


58

grep--include옵션을 사용하십시오 .

grep -ir "string" --include="*.php" .

1
좋아, 내 grep 버전이 오래된 것 같습니다. 왜냐하면 그 옵션이 없었기 때문입니다 (왜 내가 이것을 할 수 없었는지 궁금하지 않습니다!). "grep : 인식 할 수없는 옵션`--include = *. php '"메시지가 나타납니다. 하지만 방금 최신 버전으로 업그레이드했는데 이제 작동합니다. 고맙습니다!
OMA

나는 마지막에 마침표를 교체하고 사용해야했습니다.grep -ir "string" --include="*.php" *
Stuart

나는 시대가 선의 끝이라고 생각했다! 나는 사용하지 않거나 필요하지 않았다.
boardtc

14

옵션 grep이없는 버전이있는 경우 --include다음을 사용할 수 있습니다. 이것들은 다음과 같은 디렉토리 구조에서 테스트되었습니다.

$ tree
.
├── a
├── b
   └── foo2.php
├── c
   └── d
       └── e
           └── f
               └── g
                   └── h
                       └── foo.php
├── foo1.php
└── foo.php

모든 .php파일에 문자열이 포함되어 있습니다 string.

  1. 사용하다 find

    $ find . -name '*php' -exec grep -H string {} +
    ./b/foo2.php:string
    ./foo1.php:string
    ./c/d/e/f/g/h/foo.php:string
    

    설명

    모든 .php파일을 찾은 다음 grep -H string각 파일에서 실행 됩니다. 으로 find-exec옵션 {}발견 된 각 파일로 대체됩니다. 는 -Hgrep파일 이름뿐만 아니라 일치하는 라인을 인쇄 할 수 있습니다.

  2. 충분한 새 버전이 있다고 가정하면 다음을 bash사용하십시오 globstar.

    $ shopt -s globstar
    $ grep -H string  **/*php
    b/foo2.php:string
    c/d/e/f/g/h/foo.php:string
    foo1.php:string
    

    설명

    bash 매뉴얼에 설명 된대로 :

    글로브 스타

    설정하면 파일 이름 확장 컨텍스트에 사용 된 '**'패턴은 모든 파일과 0 개 이상의 디렉토리 및 하위 디렉토리와 일치합니다. 패턴 뒤에 '/'가 오면 디렉토리와 서브 디렉토리 만 일치합니다.

    따라서 실행 shopt -s globstar하면 기능과 Bash globstar옵션 이 활성화되어 현재 디렉토리의 **/*php모든 .php파일 ( **0 개 이상의 디렉토리 **/*php와 일치 하므로 일치 ./foo.php함)을 확장하여 grepp됩니다 string.


-2

사용하다 */*.php

이것은 grep 검색을 한 레벨의 서브 디렉토리 레벨로 만듭니다.


별표와 점이 사라지면서 문제가 발생했습니다.
Dennis Nolan

백틱을 사용하여 코드를 포맷하고 마크 다운 포맷을 강조하기 위해 별표를 사용하는 것에 대한 모호성을 피할 수 있습니다. 추신 :이 질문은 마지막 단락의 "재귀 적 검색"에 대해 묻습니다 (내 다운 투표는 아님).
RedGrittyBrick

당신이 언급 한 것처럼 한 수준의 깊은 디렉토리 구조에만 좋지만 그럼에도 불구하고 여전히 아는 것이 좋기 때문에 정답은 아닙니다. 그것에 대한 나의 공감대.
OMA
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.