zip, gzip, bzip 및 기타와 같은 모든 압축 파일 모음에 대해 하드 드라이브를 스캔하고 특정 파일 형식 (예 : 이미지)을 검색 한 파일의 내용을 갖고 싶습니다. 안티 바이러스 '가 그렇게하므로 방법이 있어야한다고 생각합니다.
zip, gzip, bzip 및 기타와 같은 모든 압축 파일 모음에 대해 하드 드라이브를 스캔하고 특정 파일 형식 (예 : 이미지)을 검색 한 파일의 내용을 갖고 싶습니다. 안티 바이러스 '가 그렇게하므로 방법이 있어야한다고 생각합니다.
답변:
가장 간단한 방법은 아카이브의 내용을 나열하고 관련 확장자의 파일을 찾는 것입니다. 예를 들어 zip
파일 이있는 경우
$ zip -sf foo.zip | grep -iE '\.png$|\.jpg$'
file1.jpg
file1.png
file2.jpg
file2.png
이 -sf
옵션은 zip
아카이브에 포함 된 파일을 나열하도록 지시 합니다. 그런 다음이 grep
A의 모양 .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
성공을.
-name
로는 -iname
. 그러나 많은 압축 프로그램 (예 : gzip)에는 특정 확장자가 필요합니다. GZ
작동하지 않습니다.
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
*.*
만 확장자를 가진 파일을 일치합니다. 또한 모든 아카이브의 모든 파일을 나열 하므로 파일 형식을 테스트하지 않습니다.
foo
하지만 포함 하지 않은 파일을 찾습니다foo.png
.