.gz 파일을 재귀적으로 grep하는 방법은 무엇입니까?

.gz 파일을 재귀적으로 grep하는 방법은 무엇입니까?

나는 원본 .eml을 .gz 파일로 압축하여 정기적으로 Gmail 메시지를 다운로드하는 스크립트를 사용하고 있습니다. 스크립트는 매일 폴더를 만든 다음 각 메시지를 자체 파일에 압축합니다.

이 아카이브에서 "문자열"을 검색하는 방법을 원합니다.

Grep만으로는 이 작업을 수행할 수 없는 것 같습니다. SearchMonkey도 사용해 보았습니다.

답변1

현재 디렉터리의 모든 .eml.gz 파일을 반복적으로 grep하려면 다음을 사용할 수 있습니다.

find . -name \*.eml.gz -print0 | xargs -0 zgrep "STRING"

*쉘이 해석하지 않도록 첫 번째 것을 이스케이프해야 합니다 . -print0find가 표준 입력에서 읽은 각 파일 후에 널 문자를 인쇄 xargs -0하고 각 파일에 대해 뒤에 오는 명령을 실행하도록 지시합니다. zgrepgrep, 먼저 파일의 압축을 풉니다.

답변2

단 하나가 아니기 때문에 여기에는 많은 혼란이 있습니다 zgrep. 내 시스템 에는 두 가지 버전 이 있습니다 zgrep.gzipzgrepzutils. 전자는 단지 통화일 뿐입니다 gzip -cdfq. -r, --recursive전환은 지원되지 않습니다. 1 후자는 다음 과 같은 프로그램
이다 .c++지원하다옵션 -r, --recursive.
실행하면 zgrep --version | head -n 1다음 중 어느 것이 기본값인지 표시됩니다.

zgrep (gzip) 1.6

래퍼 스크립트입니다.

zgrep (zutils) 1.3

cpp실행 파일 입니다 .
후자가 있는 경우 다음을 실행할 수 있습니다.

zgrep 'pattern' -r --format=gz /path/to/dir

어쨌든, 제안된 대로 find+는 zgrep두 버전 모두에서 동일하게 작동합니다 zgrep.

find /path/to/dir -name '*.gz' -exec zgrep -- 'pattern' {} +

zgrep시스템에 누락된 경우 (가능성이 거의 없음) 다음을 시도해 볼 수 있습니다.

find /path/to/dir -name '*.gz' -exec sh -c 'gzip -cd "$0" | grep -- "pattern"' {} \;

그러나 한 가지 큰 단점이 있습니다. 일치 라인 앞에 파일 이름이 없기 때문에 일치 항목이 어디에 있는지 알 수 없습니다.


1:문제가 생기기 때문에

답변3

aggrep, 멋진 추가 기능이 포함된 변형입니다.

  • 압축 파일의 경우 -z 옵션이 있습니다.
  • 많은 ack 기능을 가지고 있습니다.
  • 빠르다

그래서:

ag -r -z your-pattern-goes-here   folder

설치되지 않은 경우,

apt-get install silversearcher-ag   (debian and friends)
yum install the_silver_searcher     (fedora)
brew install the_silver_searcher    (mac)

(2021년 9월 수정\감사합니다(엑스유리))

또한 옵션이 rg있는 (recursive grep)을 고려하십시오.-z

rg -z your-pattern-goes-here   folder

rg에는 유용한 옵션도 많이 있습니다. 필요하다면:

apt install ripgrep 

답변4

재귀만으로는 쉽습니다.

   -r, --recursive
          Read all files  under  each  directory,  recursively,  following
          symbolic  links  only  if they are on the command line.  This is
          equivalent to the -d recurse option.

   -R, --dereference-recursive
          Read all files under each directory,  recursively.   Follow  all
          symbolic links, unlike -r.

그러나 압축 파일의 경우 다음과 같은 것이 필요합니다.

shopt globstar 
for file in /path/to/directory/**/*gz; do zcat ""$file" | grep pattern; done

path/to/directory매일의 하위 디렉터리를 포함하는 상위 디렉터리여야 합니다.


zgrep분명한 대답이지만 불행히도 해당 -r플래그를 지원하지 않습니다. 에서 man zgrep:

이러한 grep 옵션을 사용하면 zgrep이 다음 오류 코드와 함께 종료됩니다: (-[d아르 자형zZ]|--di*|--exc*|--inc*|--rec*|--nu*).

관련 정보