나는 원본 .eml을 .gz 파일로 압축하여 정기적으로 Gmail 메시지를 다운로드하는 스크립트를 사용하고 있습니다. 스크립트는 매일 폴더를 만든 다음 각 메시지를 자체 파일에 압축합니다.
이 아카이브에서 "문자열"을 검색하는 방법을 원합니다.
Grep만으로는 이 작업을 수행할 수 없는 것 같습니다. SearchMonkey도 사용해 보았습니다.
답변1
현재 디렉터리의 모든 .eml.gz 파일을 반복적으로 grep하려면 다음을 사용할 수 있습니다.
find . -name \*.eml.gz -print0 | xargs -0 zgrep "STRING"
*
쉘이 해석하지 않도록 첫 번째 것을 이스케이프해야 합니다 . -print0
find가 표준 입력에서 읽은 각 파일 후에 널 문자를 인쇄 xargs -0
하고 각 파일에 대해 뒤에 오는 명령을 실행하도록 지시합니다. zgrep
단 grep
, 먼저 파일의 압축을 풉니다.
답변2
단 하나가 아니기 때문에 여기에는 많은 혼란이 있습니다 zgrep
. 내 시스템 에는 두 가지 버전 이 있습니다 zgrep
.gzip
zgrep
zutils
. 전자는 단지 통화일 뿐입니다 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"' {} \;
그러나 한 가지 큰 단점이 있습니다. 일치 라인 앞에 파일 이름이 없기 때문에 일치 항목이 어디에 있는지 알 수 없습니다.
답변3
ag
예 grep
, 멋진 추가 기능이 포함된 변형입니다.
- 압축 파일의 경우 -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*).