복잡한 검색을 위해 찾기와 grep을 결합하는 방법은 무엇입니까? (GNU / 리눅스, 찾기, grep)


17

비슷한 디렉토리 구조를 공유하지만 GNU / Linux에서 동일한 디렉토리 트리에 있지 않은 일부 파일에서 텍스트 검색을 시도하고 있습니다.

동일한 트리 구조 (Code Igniter MVC PHP 프레임 워크)를 공유하는 많은 사이트가있는 웹 서버가 있으므로 각 사이트의 트리 아래의 특정 디렉토리에서 검색하고 싶습니다.

/srv/www/*/htdocs/system/application/

여기서 *는 사이트 이름입니다. 그리고 그 응용 프로그램 디렉토리에서 모든 트리를 잎까지 검색하고 내부에 텍스트 패턴이있는 * .php 파일을 찾습니다. "debug ("라고 말하면 정규 표현식이 필요하지 않습니다.

findgrep 을 사용하는 방법을 알고 있지만 그것들을 결합하는 데는 좋지 않습니다.

어떻게해야합니까?
미리 감사드립니다!

답변:


21

시험

find /srv/www/*/htdocs/system/application/ -name "*.php" -exec grep "debug (" {} \; -print

확장명을 application가진 파일을 찾기 위해 아래의 폴더를 반복적으로 검색하여에 .php전달해야합니다 grep.

이것에 대한 최적화는 다음을 실행하는 것입니다.

find /srv/www/*/htdocs/system/application/ -name "*.php" -print0 | xargs -0 grep -H "debug ("

이것은 xargs모든 .php파일 출력 find을 인수로 단일 grep명령 에 전달하는 데 사용 됩니다 . 예를 들어, . 의 옵션 과 의 옵션 파일 및 디렉토리 이름에 공간을 확보 올바르게 처리됩니다. 이 옵션 은 모든 상황에서 파일 이름이 인쇄되도록합니다. (기본적으로 여러 인수가 전달 될 때만 파일 이름을 인쇄합니다.)grep "debug (" file1 file2 file3-print0find-0xargs-Hgrepgrep

남자 xargs에서 :

-0

      입력 항목은 공백 대신 널 문자로 종료되며 따옴표와 백 슬래시는 특수하지 않습니다 (모든 문자가 문자 그대로 사용됨). 다른 인수처럼 취급되는 파일 문자열의 끝을 비활성화합니다. 입력 항목에 공백, 따옴표 또는 백 슬래시가 포함될 수있는 경우에 유용합니다. GNU 찾기 -print0옵션은이 모드에 적합한 입력을 생성합니다.


1
+1. 그래도 각 PHP 파일에 대해 grep을 실행합니다. 파일을 많이가있는 경우, 당신은에 의해 더욱 최적화 할 수 있습니다find /srv/www/*/htdocs/system/application/ -name "*.php" -print0 | xargs -0 grep "debug ("
유카 Matilainen

@jackem 합의. 이에 따라 답변을 업데이트하겠습니다.
nagul

2
또 다른 작은 개선 사항 : xargs는 하나의 파일 이름을 grep에 전달할 수 있습니다.이 경우 grep은 일치하는 파일 이름을 표시하지 않습니다. grep 명령에 -H를 추가하여 파일 이름을 표시하도록 할 수 있습니다.
랜디 올리 슨

@ 랜디 그것은 매우 유효한 포인트입니다.
nagul

3
이것은 진정한 괴사이지만 , 동일한 종류의 단일 프로세스 실행을 수행하는 대신 연산자를 GNU find사용할 수 있습니다 . 따라서이 답변 의 예 와 동일 하지만 프로세스 포크가 적고 파일 이름 문제의 위험은 여전히 ​​0입니다. +\;xargsfind /srv/www/*/htdocs/system/application/ -name "*.php" -exec grep -H "debug (" {} +xargs
Daniel Andersson

10

find이 예제에는 필요하지 않지만 grep직접 (적어도 GNU grep) 사용할 수 있습니다 .

grep -RH --include='*.php' "debug (" /srv/www/*/htdocs/system/application/

그리고 우리는 단일 프로세스 포크로 내려갑니다.

옵션 :

  • -R, --dereference-recursive Read all files under each directory, recursively. Follow all symbolic links, unlike -r.
  • -H, --with-filename Print the file name for each match. This is the default when there is more than one file to search.
  • --include=GLOB Search only files whose base name matches GLOB (using wildcard matching as described under --exclude).
  • --exclude=GLOB Skip any command-line file with a name suffix that matches the pattern GLOB, using wildcard matching; a name suffix is either the whole name, or any suffix starting after a / and before a +non-/. When searching recursively, skip any subfile whose base name matches GLOB; the base name is the part after the last /. A pattern can use *, ?, and [...] as wildcards, and \ to quote a wildcard or backslash character literally.

호기심을 위해서 -RH옵션은 무엇을 의미합니까?
거스

@Gus : man grep게시물에 옵션 설명 발췌를 추가 했습니다.
다니엘 앤더슨 17

0

쉘은 PHP 파일을 찾아 grep을 줄 수 있습니다. bash에서 :

shopt -s nullglob globstar
grep searchterm /srv/www/*/htdocs/system/application/**/*.php
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.