it-swarm-tr.com

Birden çok Zip dosyasında dize arama

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 dizeyi aramak istiyorum.

Bu (hangi "ORA-" dizesini içeren Zip dosyasında herhangi bir metin dosyasını arar) denedim ama işe yaramadı.

zipgrep ORA-1680 *.Zip

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

25
ziggy

Genel olarak sıkıştırılmış bir dosyadaki içeriği, şu veya bu şekilde açmadan aramak mümkün değildir. Zipgrep yalnızca unzip ve egrep'i saran bir kabuk betiği olduğundan, bunu manuel olarak da 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, aşağıdaki 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 yalnızca stdout'a (yani belleğe) açarsınız. Elbette sadece grep -a Zip dosyaları ancak dosyanın içeriğine ve deseninize bağlı olarak yanlış pozitifler ve/veya yanlış negatifler alabilirsiniz.

27
Noah

zipgrep tek bir dosya alır. Birden fazla dosyada çalışmasını sağlamak için bir döngüye yerleştirin:

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

AVFS dosya sistemi, her bir arşiv dosyasına /path/to/foo.Zip Bir dizin ~/.avfs/path/to/foo.Zip# Olarak erişilebildiği dosya sisteminin bir görünümünü sunar. Solaris'e yükleyebileceğiniz Fuse dosya sistemidir. AVFS, en yaygın arşiv dosyası biçimlerine 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