Ricerca di una stringa su più file zip


22

Sto lavorando su SunOS 5.10. Ho una cartella che contiene circa 200 file zip. Ogni file zip contiene solo un file di testo al suo interno. Vorrei cercare una stringa specifica in tutti i file di testo in tutti i file zip.

Ho provato questo (che cerca qualsiasi file di testo nel file zip che contiene la stringa "ORA-") ma non ha funzionato.

zipgrep ORA-1680 *.zip

Qual è il corretto farlo senza decomprimere i file zip?


Vedi anche Come posso ricorrere in modo ricorsivo agli archivi compressi? (non un duplicato esatto, perché i requisiti erano più complicati).
Gilles 'SO- smetti di essere malvagio' l'

Risposte:


26

In generale non è possibile cercare contenuto all'interno di un file compresso senza decomprimerlo in un modo o nell'altro. Dato che zipgrep è solo uno shellscript, che racchiude unzip ed egrep stesso, potresti farlo anche manualmente:

for file in *.zip; do unzip -c "$file" | grep "ORA-1680"; done

Se hai bisogno solo dell'elenco dei file zip corrispondenti, puoi usare qualcosa come:

for file in *.zip; do
    if ( unzip -c "$file" | grep -q "ORA-1680"); then
        echo "$file"
    fi
done

In questo modo stai solo decomprimendo su stdout (cioè in memoria) invece di decomprimere i file su disco. Ovviamente puoi provare solo grep -ai file zip ma a seconda del contenuto del file e del tuo schema, potresti ottenere falsi positivi e / o falsi negativi.


Dove sarebbe la prima opzione decomprimere i file?
ziggy,

2
unzip -cdecomprime il file in stdout. Non scrive l'intero file non compresso da nessun'altra parte.
Noah,

+1 tk molto mi salva la giornata. Aggiungo semplicemente l'eco "$ file"; decomprimere -c "$ file" | grep -q "ORA-1680"; per conoscere il nome del file + il risultato.
Mike

2
La mia versione degli unzipusi -pper lo streaming su pipe!
Gavenkoa,

Funziona in cui tutti i comandi a riga singola hanno restituito "output standard", non un nome file +1
alimack

16

zipgrepprende un singolo file. Per farlo funzionare su più file mettilo in un ciclo:

for i in *.zip
do
   zipgrep ORA-1680 "$i"
done

2
In una riga che stampa anche il nome file zip in caso di corrispondenza:for i in *.zip; do zipgrep TextToSearch $i && echo $i; done
baptx

4

Il filesystem AVFS presenta una vista del filesystem in cui ogni file di archivio /path/to/foo.zipè accessibile come directory ~/.avfs/path/to/foo.zip#. È un filesystem FUSE , che puoi installare su Solaris. AVFS fornisce l'accesso in sola lettura ai formati di file di archivio più comuni.

mountavfs
for z in ~/.avfs$PWD/*.zip; do
  find "$z#" -exec grep ORA-1680 {} +
done
fusermount -u ~/.avfs   # optional
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.