.gz 파일 목록에서 문자열을 찾는 방법은 무엇입니까?

.gz 파일 목록에서 문자열을 찾는 방법은 무엇입니까?

각 폴더에는 약 600개의 .gz 파일이 포함된 폴더 목록이 있으며 시스템은 15분마다 자동으로 생성합니다. .gz 파일에서 반복되는 특정 문자열을 표시해야 합니다. 문자열이 있는 .gz 파일을 찾으시겠어요?

답변1

topdir모든 압축 파일이 있는 최상위 디렉토리가 있고 사용 중인 GNU 구현을 가정하면 다음과 같습니다 zgrep.

zgrep -R -l -F --include='*.gz' -e 'string' topdir

압축된 파일에서 하위 문자열을 검색 string하고 일치하는 모든 파일의 경로 이름을 반환합니다.gziptopdir

zgrepGNU가 없는 시스템에서는 zgrep이것을 사용하지 못할 수도 있습니다 --include. 압축된 파일만 포함한다면 문제가 되지 않을 수도 있지만 topdir, 파일 이름 접미사가 있는 파일만 검색하려는 경우에는 .gz그렇게 할 수 있습니다.

find topdir -type f -name '*.gz' -exec zgrep -l -F -e 'string' {} +

.gz이것은 이름이 under로 끝나는 모든 일반 파일을 찾아 가능한 가장 큰 배치에서 주어진 명령을 실행 topdir합니다 .zgrep

그게 없어도 zgrep이렇게 할 수 있어요

find topdir -type f -name '*.gz' -exec sh -c '
    for pathname do
        if gzip -dc "$pathname" | grep -q -F -e 'string'; then
            printf "%s\n" "$pathname"
        fi
    done' sh {} +

이는 각 파일을 추출하여 plain 에 전달합니다 grep. 주어진 문자열이 포함된 줄이 발견되면 파일의 경로 이름이 인쇄됩니다.

*.gz"내부" 셸 스크립트는 단일 디렉터리의 모든 파일을 처리하도록 쉽게 수정할 수 있는 루프입니다 .

for pathname in ./*.gz; do
    if gzip -dc "$pathname" | grep -q -F -e 'string'; then
        printf "%s\n" "$pathname"
    fi
done

string하위 문자열이 아닌 완전한 단어로 일치시키 려면 -w위의 호출에 추가하세요 grep. 정규식으로 해석되도록 하려면 string제거하십시오 -F.

답변2

사전에 알려지지 않은 반복 문자열을 찾는 경우 다음은 파일 세트에서 반복되는 단어를 찾는 스크립트입니다(여기서 단어는 주위에 공백이 있는 모든 것을 의미합니다).

#!/bin/bash

dup_words() {
    zcat $1 | tr ' ' '\n' | sed '/^$/d' | sort | uniq -c | awk '{if ($1 > 1) m=1; } END { exit(!m) } '
}

for i in *.gz
do
    dup_words $i && echo $i
done

공백이 나타날 때마다 줄을 나눈 다음 빈 줄을 제거하고 발생 횟수를 찾아 계산한 다음 마지막으로 1회 이상 발생하는지 확인합니다.

루프는 파일 이름만 출력하며 &&필요에 따라 후속 작업을 조정할 수 있습니다.

답변3

이 명령을 사용하면 특정 폴더 아래의 특정 .gz 파일에 문자열이 나타나는지 확인할 수 있습니다.

zgrep the_string  *.gz -l

하나의 폴더에 모두 들어 있는 폴더 목록에 대해 이 작업을 수행하려면 다음을 수행하십시오.

find . -name "*.gz" | xargs zgrep the_string -l

예를 들어 출력은 다음과 같습니다.

./tmp/2/F.tar.gz
./tmp/2/F1.tar.gz
./tmp/1/F.tar.gz
./tmp/1/F1.tar.gz

이제 해당 문자열을 포함하는 파일 목록이 표시됩니다.

답변4

이 명령을 사용할 수 있습니다 -

zgrep "foo" $(find . -name "*.gz")

관련 정보