Mencari string pada banyak file zip

22

Saya sedang mengerjakan SunOS 5.10. Saya memiliki folder yang berisi sekitar 200 file zip. Setiap file zip hanya berisi satu file teks di dalamnya. Saya ingin mencari string tertentu di semua file teks di semua file zip.

Saya mencoba ini (yang mencari file teks dalam file zip yang berisi string "ORA-") tetapi tidak berhasil.

zipgrep ORA-1680 *.zip

Apa yang benar melakukannya tanpa membuka file zip?

ziggy
sumber
Lihat juga Bagaimana cara saya menerobos arsip terkompresi secara rekursif? (bukan duplikat yang tepat, karena persyaratan di sana lebih rumit).
Gilles 'SANGAT berhenti menjadi jahat'

Jawaban:

26

Secara umum tidak mungkin untuk mencari konten dalam file terkompresi tanpa mengompresnya dengan satu atau lain cara. Karena zipgrep hanyalah sebuah shellscript, membungkus unzip dan egrep itu sendiri, Anda sebaiknya melakukannya secara manual:

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

Jika Anda hanya perlu daftar file zip yang cocok, Anda dapat menggunakan sesuatu seperti:

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

Dengan cara ini Anda hanya melakukan dekompresi ke stdout (mis. Ke memori) alih-alih mendekompres file ke disk. Anda tentu saja dapat mencoba hanya grep -afile zip tetapi tergantung pada konten file dan pola Anda, Anda mungkin mendapatkan positif palsu dan / atau negatif palsu.

Nuh
sumber
Di mana opsi pertama membuka ritsleting file?
ziggy
2
unzip -cmendekompres file ke stdout. Itu tidak menulis seluruh file terkompresi di tempat lain.
Nuh
+1 tks banyak menghemat hari saya. Saya baru saja menambahkan gema "$ file"; unzip -c "$ file" | grep -q "ORA-1680"; untuk mengetahui nama file + hasilnya.
Mike
2
Versi saya yang unzipdigunakan -puntuk streaming ke pipa!
gavenkoa
Ini bekerja di mana semua perintah baris tunggal mengembalikan "output standar", bukan nama file +1
alimack
16

zipgrepmengambil satu file. Untuk membuatnya berfungsi di banyak file, letakkan dalam satu lingkaran:

for i in *.zip
do
   zipgrep ORA-1680 "$i"
done
dogbane
sumber
2
Dalam satu baris yang juga mencetak nama file zip jika ada kecocokan:for i in *.zip; do zipgrep TextToSearch $i && echo $i; done
baptx
4

Sistem file AVFS menyajikan tampilan sistem file di mana setiap file arsip /path/to/foo.zipdapat diakses sebagai direktori ~/.avfs/path/to/foo.zip#. Ini adalah sistem file FUSE , yang dapat Anda instal di Solaris. AVFS menyediakan akses hanya baca ke sebagian besar format file arsip.

mountavfs
for z in ~/.avfs$PWD/*.zip; do
  find "$z#" -exec grep ORA-1680 {} +
done
fusermount -u ~/.avfs   # optional
Gilles 'SANGAT berhenti menjadi jahat'
sumber