Wyszukiwanie ciągu w wielu plikach zip

22

Pracuję nad SunOS 5.10. Mam folder zawierający około 200 plików zip. Każdy plik zip zawiera tylko jeden plik tekstowy. Chciałbym wyszukać określony ciąg we wszystkich plikach tekstowych we wszystkich plikach zip.

Próbowałem tego (który szuka dowolnego pliku tekstowego w pliku zip, który zawiera ciąg „ORA-”), ale nie zadziałało.

zipgrep ORA-1680 *.zip

Co jest poprawne, robiąc to bez rozpakowywania plików zip?

zygzak
źródło
Zobacz także Jak rekurencyjnie przeglądać skompresowane archiwa? (nie jest to dokładny duplikat, ponieważ wymagania były bardziej skomplikowane).
Gilles 'SO - przestań być zły'

Odpowiedzi:

26

Zasadniczo wyszukiwanie zawartości w skompresowanym pliku nie jest możliwe bez jego dekompresji. Ponieważ zipgrep jest tylko skryptem powłoki, rozpakowującym rozpakowanie i samo egrep, równie dobrze możesz to zrobić ręcznie:

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

Jeśli potrzebujesz tylko listy pasujących plików zip, możesz użyć czegoś takiego:

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

W ten sposób dekompresujesz tylko do standardowego wyjścia (tj. Do pamięci) zamiast dekompresować pliki na dysk. Możesz oczywiście spróbować po prostu grep -azapisać pliki zip, ale w zależności od zawartości pliku i wzorca możesz uzyskać fałszywie pozytywne i / lub fałszywe negatywy.

Noah
źródło
Gdzie pierwsza opcja rozpakuje pliki?
ziggy
2
unzip -cdekompresuje plik na standardowe wyjście. Nigdzie indziej nie zapisuje całego nieskompresowanego pliku.
Noah,
+1 bardzo dużo, to oszczędza mój dzień. Po prostu dodaję echo „$ file”; rozpakuj -c "$ plik" | grep -q "ORA-1680"; znać nazwę pliku + wynik.
Mike
2
Moja wersja unzipzastosowań -pdo przesyłania strumieniowego do potoku!
gavenkoa
Działa to tam, gdzie wszystkie polecenia jednowierszowe zwróciły „standardowe wyjście”, a nie nazwę pliku +1
alimack
16

zipgreppobiera pojedynczy plik. Aby działał na wielu plikach, umieść go w pętli:

for i in *.zip
do
   zipgrep ORA-1680 "$i"
done
dogbane
źródło
2
W jednym wierszu, który również wypisuje nazwę pliku zip, jeśli istnieje dopasowanie:for i in *.zip; do zipgrep TextToSearch $i && echo $i; done
baptx
4

System plików AVFS przedstawia widok systemu plików, w którym każdy plik archiwum /path/to/foo.zipjest dostępny jako katalog ~/.avfs/path/to/foo.zip#. Jest to system plików FUSE , który można zainstalować w systemie Solaris. AVFS zapewnia dostęp tylko do odczytu do najpopularniejszych formatów plików archiwów.

mountavfs
for z in ~/.avfs$PWD/*.zip; do
  find "$z#" -exec grep ORA-1680 {} +
done
fusermount -u ~/.avfs   # optional
Gilles „SO- przestań być zły”
źródło