Birden fazla zip dosyasında bir dizge aramak


22

SunOS 5.10 üzerinde çalışıyorum. Yaklaşık 200 zip dosyası içeren bir klasör var. Her zip dosyası içinde sadece bir metin dosyası içerir. Tüm zip dosyalarındaki tüm metin dosyalarında belirli bir dize aramak istiyorum.

Bunu denedim (hangi "ORA-" dizesini içeren zip dosyasındaki herhangi bir metin dosyasını arar) ancak işe yaramadı.

zipgrep ORA-1680 *.zip

Zip dosyalarını açmadan bunu yapmanın doğru nedir?


Ayrıca bkz. Sıkıştırılmış arşivleri yinelemeli olarak nasıl okurum? (kesin bir kopya değil, çünkü gereksinimler daha karmaşıktı).
Gilles 'SO- kötülük' dur

Yanıtlar:


26

Genel olarak sıkıştırılmış bir dosyadaki içeriği bir şekilde açmadan aramak mümkün değildir. Zipgrep yalnızca bir kabuk betiği olduğundan, unzip ve egrep dosyasının kendisini sarmalaması, el ile de yapabilirsiniz:

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

Yalnızca eşleşen zip dosyalarının listesine ihtiyacınız varsa, bunun gibi bir şey kullanabilirsiniz:

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

Bu şekilde, dosyaları diske açmak yerine sadece stdout'a (yani belleğe) dekompresyon yapıyorsunuz. Elbette sadece grep -azip dosyalarını deneyebilirsiniz, ancak dosyanın içeriğine ve kalıbınıza bağlı olarak yanlış pozitif ve / veya yanlış negatif alabilirsiniz.


İlk seçenek dosyaları nerede açacak?
ziggy

2
unzip -cDosyayı stdout'a sıkıştırır. Tüm sıkıştırılmamış dosyayı başka hiçbir yere yazmaz.
Nuh

+1 çok fazla zaman harcıyor. Ben eko "$ dosya" eklemek juste; unzip -c "$ dosya" | grep -q "ORA-1680"; Dosya adını bilmek + sonucu.
Mike

2
Pipo akışı için unzipkullandığım sürüm -p!
gavenkoa

Bu, tüm tek satır komutlarının "standart çıktı" döndürdüğü, +1
alimack

16

zipgreptek bir dosya alır. Birden fazla dosya üzerinde çalışmasını sağlamak için onu bir döngüye koyun:

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

2
Aynı zamanda, eğer bir eşleşme varsa zip for i in *.zip; do zipgrep TextToSearch $i && echo $i; done
dosyasını

4

AVF'lerin dosya sistemi hediyeler her arşiv dosyası dosya sisteminin bir görünüm /path/to/foo.zipbir dizin olarak erişilebilir ~/.avfs/path/to/foo.zip#. Solaris'e yükleyebileceğiniz bir FUSE dosya sistemidir. AVFS, en yaygın arşiv dosya formatlarına salt okunur erişim sağlar.

mountavfs
for z in ~/.avfs$PWD/*.zip; do
  find "$z#" -exec grep ORA-1680 {} +
done
fusermount -u ~/.avfs   # optional
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.