모든 서브 디렉토리의 모든 gzip 파일 내에서 문자열의 유닉스 'grep'


8

.gz모든 디렉토리 및 하위 디렉토리의 모든 파일을 통해 문자열을 재귀 적으로 grep하는 방법은 무엇입니까?

답변:


13

@Steve Weet이 거의 있습니다. 추가 인수로 / dev / null을 사용하는 것은 파일 이름을 표시하도록하는 좋은 방법입니다 (Steve 덕분에 기억합니다). 그러나 여전히 발견 된 모든 파일에 대해 exec를 실행합니다.

가능한 한 몇 번 zgrep을 실행하여 각 실행을 최대한 활용하고 싶습니다.

find . -iname '*.gz' -print0 | xargs -0 zgrep PATTERN

xargszgrep에 가능한 많은 args (파일 이름)를 제공하고 find명령이 제공 한 모든 파일을 사용할 때까지 반복적으로 실행합니다 . 은 Using -print0-0파일이나 디렉토리 이름의 공백이있는 경우 옵션은 작업에 있습니다.

Mac OS X에서는 xargs없이 동일한 효과를 얻을 수 있습니다.

find . -iname '*.gz' -exec zgrep PATTERN {} +

+1 정말 좋습니다. 나는 xargs가 하나 이상의 논쟁을 통과했다는 것을 몰랐다. 제 * nix 명령 행 -fu의 대부분은 20 살이며 20 년 전에는 xargs가 그렇게하지 않았다고 생각합니다.
Steve Weet

os / x에서 find는 xargs와 같은 방식으로 작동합니다
Steve Weet

1
-exec로 끝나는 '+'에 관한 Steve Weet의 답변에 대한 내 의견을 참조하십시오.
Daniel Andersson

-HGNU grep에서 파일 이름을 항상 일치하는 줄과 함께 표시하는 데 사용하십시오 .
Daniel Andersson

1
$ zgrep --help
Usage: /bin/zgrep [OPTION]... [-e] PATTERN [FILE]...
Look for instances of PATTERN in the input FILEs, using their
uncompressed contents if they are compressed.

그래서 같은

find . -iname "*.gz" -exec zgrep PATTERN {} \

-exec는 파일 이름을 볼 수 없도록 반복하는 모든 파일에 대해 새 zgrep 인스턴스를 생성합니다. zgrep -r나무를 통과하거나 -r이 작동하지 않는 경우 검색 결과를 파이프로 연결하는 것이 좋습니다.xargs zgrep
Noufal Ibrahim

내가 얻을 /bin/zgrep: -r: option not supported내 새로 설치된 우분투 시스템.
aioobe

xargs대신 사용할 수 있습니다 .
Noufal Ibrahim

-exec로 끝나는 '+'에 관한 Steve Weet의 답변에 대한 내 의견을 참조하십시오.
Daniel Andersson

1

@aioobe가 거의 있습니다. 명령은 작업을 수행하지만 파일 이름을 알려주지 않습니다.

다음은 파일 이름도 알려줍니다.

find . -iname "*.gz" -exec zgrep PATTERN {} /dev/null \;

추가 /dev/null하면 zgrep에서 두 개의 파일 이름을 볼 수 있으므로 문자열을 찾으면 파일 이름이 표시됩니다.

편집하다

추가 연구에 따르면 내 컴퓨터 (OS / X)의 경우 -exec찾을 인수에 따라 가능한 많은 파일 이름이 추가됩니다 ( xargs동작 방식과 유사 ).


그것은 꽤 멋지다. 나는 OSX에 대해 몰랐다 -exec-나는 이식성에 관한 것이기 때문에 스크립트에서 사용하지 않지만 명령 프롬프트에는 훌륭하다.

다른 버전의 찾기의 경우 '\;'대신 '+'사용 exec 문을 끝내려면이 스레드의 스토리에 의해 OSX와 동일하게 기본적으로 수행됩니다. '-exec 명령 {} +'에 대한 수동 항목을 참조하십시오. 모든 버전에 적용되는 것은 find아니지만 대부분의 최신 버전 (예 : 데비안 기반 배포판)입니다.
Daniel Andersson

-H적어도 /dev/null해킹 대신 GNU grep에서 일치하는 줄을 가진 파일 이름을 항상 표시하는 데 사용하십시오 .
Daniel Andersson

0

다음은 치료법을 작동시킵니다. zsh

for archive in **/*.gz; do
    echo "[${archive}] "
    gzip -dc ${archive} | grep -n "String"
done

이 글은 다음 언어로도 작동 할 수 bash, ksh등 ...

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.