it-swarm.it

Ricerca di una stringa su più file Zip

Sto lavorando su SunOS 5.10. Ho una cartella che contiene circa 200 file Zip. Ogni file Zip contiene solo un file di testo. 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?

25
ziggy

In generale non è possibile cercare contenuto all'interno di un file compresso senza decomprimerlo in un modo o nell'altro. Poiché zipgrep è solo uno shellscript, racchiude unzip ed egrep stesso, è possibile farlo 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 a solo grep -a i file Zip ma a seconda del contenuto del file e del modello, potresti ottenere falsi positivi e/o falsi negativi.

27
Noah

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

for i in *.Zip
do
   zipgrep ORA-1680 "$i"
done
18
dogbane

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 file system 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