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


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.