Trova e cerca all'interno di tutti i file compressi


9

Mi piacerebbe scansionare il mio disco rigido per tutte le raccolte di file compressi come zip, gzip, bzip e altri e avere il contenuto di quelli cercati per determinati tipi di file (come le immagini). L'antivirus "lo fa, quindi credo che dovrebbe esserci un modo.


@Rinzwind che cercherà all'interno dei file dell'archivio, non all'interno dell'elenco dei file. Troverà i file che contengono fooma non foo.png.
terdon,

Questo può essere utile per verificare la presenza di una bomba Zip! +1
Sharad Gautam,

Risposte:


17

L'approccio più semplice sarebbe quello di elencare i contenuti dell'archivio e cercare i file dell'estensione pertinente. Ad esempio, con un zipfile:

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

L' -sfopzione dice zipdi elencare i file contenuti in un archivio. Quindi, grepcercherà un .pngo .jpgche si trovano alla fine della riga ( $). Il -Eabilitazioni esteso le espressioni regolari, in modo che possiamo usare |come OR e la -irende il caso di corrispondenza insensibile.

Tuttavia, ogni strumento di archiviazione ha un comando diverso per elencare i contenuti. Ho scritto una sceneggiatura in grado di gestire la maggior parte di quelli più popolari. Se si salva lo script come list_compressed.sh, è possibile quindi eseguire:

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

Ciò mostrerebbe i tipi di immagine più comuni. Si noti che questo approccio presuppone che il tipo di file possa essere determinato dall'estensione del file. Non troverà i file di immagine che non hanno un'estensione e non riconoscerà i file con l'estensione errata. Non c'è modo di affrontarlo senza effettivamente estrarre i file dall'archivio e eseguirli filesu ciascuno di essi.


Se si desidera trovare tutti gli archivi che contengono file di immagine sul disco rigido, combinare quanto sopra 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

Il comando find cercherà tutti .gz, .tgzo .zipfile (puoi aggiungere tutte le estensioni che vuoi), che vengono poi passate attraverso il mio script. I -qSopprime grep è in uscita normale, niente verranno stampati. Il && echostamperà il nome del archivio solo se l' grepha avuto successo.


Secondo la mia domanda originale vorrei "scansionare il mio disco rigido per tutte le raccolte di file compressi, come zip, che contengono immagini". Hai aiutato a guardare negli archivi stessi, ma voglio solo identificare quali archivi contengono immagini.
6ft Dan

@ 6ftDan mi dispiace, non avevo visto l'originale. Sentiti libero di ripristinare o modificare nuovamente qualsiasi modifica che cambi il significato del tuo post. Vedi la risposta aggiornata per come cercare nell'intero file system.
terdon,

Fantastico, ma dal momento che stai scherzando senza distinzione tra maiuscole e minuscole forse vuoi anche cercare tra le maiuscole e minuscole?
kos,

@kos hmm, che è abbastanza facile da fare solo il cambiamento -namea -iname. Tuttavia, ha poco senso, molti programmi di compressione (ad esempio gzip) hanno bisogno dell'estensione specifica. GZnon funzionerà.
terdon,

3

Non avanzato come Terdon, ma questo farà:

Salvare il seguente codice, in una cartella in cui risiede tutto il codice, come finda.sho qualsiasi altro nome desiderato:

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

Quindi in una directory dove erano tutti i tuoi archivi, eseguilo e questo è l'output:

./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

Secondo la mia domanda originale vorrei "scansionare il mio disco rigido per tutte le raccolte di file compressi, come zip, che contengono immagini". Hai aiutato a guardare negli archivi stessi, ma voglio solo identificare quali archivi contengono immagini.
6ft Dan

@ 6ftDan Quello, penso sia possibile, ma potrebbe richiedere del tempo. Nel frattempo, ho aggiunto alcuni miglioramenti alla mia sceneggiatura, con l'aiuto di Terdon.
blade19899

Nota che *.*corrisponderà solo ai file con un'estensione. Inoltre, questo elencherà tutti i file in tutti gli archivi, non stai testando alcun tipo di file.
terdon,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.