모든 압축 파일에서 찾기 및 검색


9

zip, gzip, bzip 및 기타와 같은 모든 압축 파일 모음에 대해 하드 드라이브를 스캔하고 특정 파일 형식 (예 : 이미지)을 검색 한 파일의 내용을 갖고 싶습니다. 안티 바이러스 '가 그렇게하므로 방법이 있어야한다고 생각합니다.


@Rinzwind는 파일 목록이 아닌 아카이브 파일 내에서 검색합니다. 포함 foo하지만 포함 하지 않은 파일을 찾습니다 foo.png.
— terdon

이것은 우편 폭탄을 확인하는 데 도움이 될 수 있습니다! +1
— Sharad Gautam

답변:


17

가장 간단한 방법은 아카이브의 내용을 나열하고 관련 확장자의 파일을 찾는 것입니다. 예를 들어 zip파일 이있는 경우

$ zip -sf foo.zip | grep -iE '\.png$|\.jpg$'
  file1.jpg
  file1.png
  file2.jpg
  file2.png

이 -sf옵션은 zip아카이브에 포함 된 파일을 나열하도록 지시 합니다. 그런 다음이 grepA의 모양 .png이나 .jpg그 줄의 끝 (에있다 $). 은 -E우리가 사용할 수 있도록, 정규 표현식을 확장 가능 |OR로와는 -i일치하는 경우를 구분한다.

그러나 각 아카이브 도구에는 내용을 나열하는 명령이 다릅니다. 가장 인기있는 스크립트 를 다룰 수 있는 스크립트 를 작성했습니다 . 해당 스크립트를로 저장 list_compressed.sh하면 다음을 실행할 수 있습니다.

list_compressed.sh | grep -iE '\.png$|\.jpg$|\.jpeg$|\.gif$|\.tif$|\.tiff$'

가장 일반적인 이미지 유형이 표시됩니다. 이 방법은 파일 확장자가 파일 형식을 결정할 수 있다고 가정합니다. 확장자가없는 이미지 파일을 찾지 못하고 확장자가 잘못된 파일을 인식하지 못합니다. 실제로 아카이브에서 파일을 추출하여 각 파일에서 실행하지 않고는이를 처리 할 방법이 없습니다 file.


하드 드라이브에 이미지 파일이 포함 된 모든 아카이브 를 찾으려면 위와 다음을 결합하십시오 find.

find / -name '*.gz' -o -name '*.tgz' -o -name '*.zip' -print0 |
    while IFS= read -r -d '' arch; do    
        list_compressed.sh "$arch" | 
            grep -qiE '\.png$|\.jpg$|\.jpeg$|\.gif$|\.tif$|\.tiff$' &&
                echo "$arch contains image(s)"
    done

find 명령은 모든 검색합니다 .gz, .tgz또는 .zip그 다음 내 스크립트를 통해 전달되는 파일은 (당신이 원하는대로 당신은 많은 확장으로 추가 할 수 있습니다). -q정상 출력의 GREP 억압은 아무것도 인쇄되지 않습니다. 이 && echo(가) 경우에만 아카이브의 이름을 인쇄합니다 grep성공을.


원래 질문에 따르면 "zip과 같이 이미지가 들어있는 모든 압축 파일 모음에 대해 하드 드라이브를 스캔하고 싶습니다". 아카이브 자체를 살펴 보는 데 도움이되었지만 이미지가 포함 된 아카이브를 식별하려고합니다.
— 6ft Dan

죄송합니다. 원본을 보지 못했습니다. 게시물의 의미를 변경하는 모든 수정 사항을 롤백하거나 다시 수정하시기 바랍니다. 전체 파일 시스템을 검색하는 방법은 업데이트 된 답변을 참조하십시오.
— terdon

대단하지만 대소 문자를 구분하지 않으므로 대소 문자를 구분하지 않고 검색하고 싶습니까?
— kos

흠 @kos, 그건 그냥 변화 할 수있는 쉬운 충분 -name로는 -iname. 그러나 많은 압축 프로그램 (예 : gzip)에는 특정 확장자가 필요합니다. GZ작동하지 않습니다.
— terdon 2016 년

3

terdon만큼 발전하지는 않았지만 다음과 같이 할 것입니다.

다음 코드를 모든 코드가있는 폴더에 finda.sh, 또는 다른 이름으로 저장하십시오.

for file in *.*; do
    if ( 7z l -slt "$file"> /tmp/$file.log); then
       echo $file:; cat /tmp/$file.log | grep -iE 'Path*'> $file.log && cat $file.log
    fi
done

그런 다음 모든 아카이브가있는 디렉토리에 실행하십시오. 이것은 출력입니다.

./finda.sh 
one.7z:
Path = one/abradabra.png
Path = one/birb.png
three.rar:
Path = three/blah.png
Path = three/qwa0g.jpg
two.zip:
Path = two/whut.png

원래 질문에 따르면 "zip과 같이 이미지가 들어있는 모든 압축 파일 모음에 대해 하드 드라이브를 스캔하고 싶습니다". 아카이브 자체를 살펴 보는 데 도움이되었지만 이미지가 포함 된 아카이브를 식별하려고합니다.
— 6ft Dan

@ 6ftDan 가능하다고 생각하지만 시간이 걸릴 수 있습니다. 그 동안 나는 terdon의 도움을 받아 스크립트를 개선했습니다.
— blade19899

참고 *.*만 확장자를 가진 파일을 일치합니다. 또한 모든 아카이브의 모든 파일을 나열 하므로 파일 형식을 테스트하지 않습니다.
— terdon
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.