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


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옵션 {}발견 된 각 파일로 대체됩니다. 는 -H알 grep파일 이름뿐만 아니라 일치하는 라인을 인쇄 할 수 있습니다.

  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.