Encuentra y busca dentro de todos los archivos comprimidos

10

Me gustaría escanear mi disco duro en busca de todas las colecciones de archivos comprimidos como zip, gzip, bzip y otros, y tener el contenido de aquellos buscados para ciertos tipos de archivos (como imágenes). Anti-virus 'hacerlo, así que creo que debería haber una manera.

6 pies Dan
fuente
@Rinzwind que buscará dentro de los archivos del archivo, no dentro de la lista de archivos. Encontrará archivos que contengan foopero no foo.png.
terdon
¡Esto puede ser útil para verificar si hay una bomba Zip! +1
Sharad Gautam

Respuestas:

18

El enfoque más simple sería enumerar el contenido del archivo y buscar archivos de la extensión relevante. Por ejemplo, con un ziparchivo:

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

La -sfopción le indica zipque enumere los archivos contenidos en un archivo. Luego, grepbuscará uno .pngo .jpgque están al final de la línea ( $). El -Epermite extenderse expresiones regulares, así que podemos usar |como O y la -ihace el caso coincidente insensible.

Sin embargo, cada herramienta de archivo tiene un comando diferente para enumerar los contenidos. He escrito un guión que puede tratar con la mayoría de los más populares. Si guarda ese script como list_compressed.sh, entonces podría ejecutar:

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

Eso le mostraría los tipos de imágenes más comunes. Tenga en cuenta que este enfoque supone que el tipo de archivo puede determinarse por la extensión del archivo. No encontrará archivos de imagen que no tengan una extensión y no reconocerá archivos con la extensión incorrecta. No hay forma de lidiar con eso sin extraer los archivos del archivo y ejecutarlos fileen cada uno de ellos.


Si desea encontrar todos los archivos que contienen archivos de imagen en su disco duro, combine lo anterior con 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

El comando find buscará los materiales .gz, .tgzo .ziparchivos (se puede añadir tantas extensiones como desee), los que a continuación se pasan a través de mi guión. Los -qsuprime grep salida normal, nada se imprimirán. El && echoimprimirá el nombre del archivo sólo si el greptuvo éxito.

terdon
fuente
Según mi pregunta original, me gustaría "escanear mi disco duro para todas las colecciones de archivos comprimidos, como zip, que contienen imágenes". Has ayudado a buscar en los propios archivos, pero solo quiero identificar qué archivos contienen imágenes.
6 pies Dan
@ 6ftDan lo siento, no había visto el original. No dude en revertir o volver a editar cualquier edición que cambie el significado de su publicación. Consulte la respuesta actualizada sobre cómo buscar en todo el sistema de archivos.
terdon
Genial, pero dado que estás haciendo mayúsculas y minúsculas entre mayúsculas y minúsculas, ¿quizás también quieras buscar entre mayúsculas y minúsculas?
kos
@kos hmm, eso es bastante fácil de hacer simplemente cambiar -namea -iname. Sin embargo, no tiene mucho sentido, muchos programas de compresión (gzip, por ejemplo) necesitan la extensión específica. GZno funciona
terdon
3

No es tan avanzado como el terdon, pero esto servirá:

Guarde el siguiente código, en una carpeta donde reside todo su código, como finda.sho cualquier otro nombre que desee:

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

Luego, en un directorio donde están todos sus archivos, ejecútelo y esta es la salida:

./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
cuchilla19899
fuente
Según mi pregunta original, me gustaría "escanear mi disco duro para todas las colecciones de archivos comprimidos, como zip, que contienen imágenes". Has ayudado a buscar en los propios archivos, pero solo quiero identificar qué archivos contienen imágenes.
6 pies Dan
@ 6ftDan Eso, creo que es posible, pero puede llevar un tiempo. Mientras tanto, agregué algunas mejoras a mi script, con la ayuda de terdon.
blade19899
Tenga en cuenta que *.*solo coincidirá con archivos con una extensión. Además, esto enumerará todos los archivos en todos los archivos, no está probando ningún tipo de archivo.
terdon