it-swarm.asia

Bir borudan içeri giren dosyaları açmak

Unzip veya benzer programların standart çıktıda çalışmasını sağlayabilir miyim? Durum, bir Zip dosyasını indiriyorum, bu da anında açılması gerekiyordu.

İlgili sorun: İndirilen bir dosyayı bash'daki standart çıktıya nasıl bağlarım?

43
Alex

Bir Zip dosyası aslında bir kapsayıcı formatı olsa da, dosya belleğe yeterince kolayca sığabiliyorsa, bir kanaldan (stdin) okunamamasının bir nedeni yoktur. Aşağıda, bir Zip dosyasını standart girdi olarak alan ve içeriği geçerli dizine veya belirtilmişse belirtilen bir dizine ayıklayan bir Python komut dosyasıdır.

import zipfile
import sys
import StringIO
data = StringIO.StringIO(sys.stdin.read())
z = zipfile.ZipFile(data)
dest = sys.argv[1] if len(sys.argv) == 2 else '.'
z.extractall(dest)

Bu komut dosyası bir satıra küçültülebilir ve takma ad olarak oluşturulabilir.

alias unzip-stdin="python -c \"import zipfile,sys,StringIO;zipfile.ZipFile(StringIO.StringIO(sys.stdin.read())).extractall(sys.argv[1] if len(sys.argv) == 2 else '.')\""

Şimdi wget çıktısını kolayca açın.

wget http://your.domain.com/your/file.Zip -O - | unzip-stdin target_dir
22
Jason R. Coombs

Bu, beklediğiniz gibi çalışma olasılığı düşüktür. Zip yalnızca bir sıkıştırma biçimi değil aynı zamanda bir konteyner biçimidir. Hem katran hem de gzip.bzip2'nin işlerini bir araya getirir. Zip'inizde tek bir dosya varsa, dosyaları stdout'a çıkarmak için unzip -p'yi kullanabilirsiniz. Birden fazla dosyanız varsa, nereden başlayıp durduklarını söylemenin bir yolu yoktur.

Stdin'den okumaya gelince, unzip man sayfasında şu cümle var:

Funzip dışında standart girdiden okunan arşivler henüz desteklenmemektedir (ve daha sonra arşivin yalnızca ilk üyesi çıkarılabilir).

Funzip ile biraz şansınız olabilir.

18
David Pashley

Yapmak istediğiniz şey, unzip 'nin bağımsız girdi yerine standart girdisinde ZIPped dosyası almasını sağlamaktır. Bu genellikle gzip ve tar türünde bir - argüman. Ancak standart unzip bunu yapmaz (yine de bir boruya ekstraksiyonu destekler). Ancak, her şey kaybolmaz ...

funzip kılavuz sayfasına bakınız.

dosya argümanı olmadan funzip bir filtre görevi görür; diğer bir deyişle, bir Zip arşivinin (veya bir gzip'd dosyasının) standart girdiye aktarıldığını varsayar ve ilk üyeyi arşivden stdout'a çıkarır. Stdin bir tty cihazından geldiğinde funzip, bunun (ikili) sıkıştırılmış veri akışı olamayacağını varsayar ve bunun yerine kısa bir yardım metni gösterir. Bir dosya argümanı varsa, girdi stdin yerine belirtilen dosyadan okunur.

Tek üyeli ekstraksiyon üzerindeki sınırlama göz önüne alındığında, funzip en çok tar (1) gibi ikincil bir arşivleyici programı ile birlikte kullanışlıdır. Aşağıdaki bölüm, banda disk yedeklemeleri durumunda bu kullanımı gösteren bir örnek içermektedir.

Bu, çoğu linux arşivinin genellikle TAR'ed ve daha sonra bir şekilde ZIP'lendiğine (gzip, bzip, et al) iyi gider. Bir tar.Zip.


funzip'ın Info-Zip orijinal yazarı Mark Adler tarafından yazıldığını belirtmek gerekir. Funzip man sayfasında yazıyor,

this functionality should be incorporated into unzip itself (future release).

ancak, böyle bir güncelleme görülmüyor. Diğer arşivleme yöntemleri TAR ile kolayca çalıştığından Mark'ın bunu gereksiz bulduğundan şüpheleniyorum.

7
nik

Varsayılan olarak yüklendiğinden curl kullanmayı seviyorum (-L sık gerçekleşen yönlendirmeler için gereklidir):

curl -L http://example.com/file.Zip | bsdtar -xvf - -C /path/to/directory/

Ancak, bsdtar varsayılan olarak yüklenmez ve funzip 'nin çalışmasını sağlayamadım.

7
Todd Partridge

Bu benzer bir soruya cevabım bir repost.

Zip dosyası biçimi arşivin sonunda bir dizin (dizin) içerir. Bu dizin, arşiv içinde her dosyanın nerede bulunduğunu söyler ve böylece tüm arşivi okumadan hızlı, rastgele erişime izin verir.

Bu, bir kanaldan Zip arşivini okumaya çalışırken bir dizinin sonuna kadar erişilememesi ve dosya tamamen okunana ve artık kullanılamamasına kadar tek tek üyelerin doğru şekilde ayıklanamaması gibi bir sorun teşkil ediyor gibi görünmektedir. . Bu nedenle, çoğu Zip dekompresörünün arşiv bir borudan beslendiğinde başarısız olması şaşırtıcı görünmemektedir.

Arşivin sonundaki dizin, dosya meta bilgilerinin arşivde depolandığı yalnızca konum değildir. Buna ek olarak, tek tek girişler bu bilgileri artıklık amacıyla yerel bir dosya başlığına da ekler.

Her Zip sıkıştırıcısı, dizin kullanılamadığında yerel dosya başlıklarını kullanmasa da, tar ve cpio ön tarafı libarchive'a (aka bsdtar ve bsdcpio) girebilir ve olacaktır bunu bir borudan okurken yapın, yani aşağıdakiler mümkündür:

wget -qO- http://example.org/file.Zip | bsdtar -xvf-
5
ruario

Zsh'de aşağıdakileri yapabilirsiniz:

unzip =( curl http://example.com/someZipFile.Zip )
4
Ian Robertson

Bunu yapacak en basit ortak yardımcı program jar 'dır; İşlemler için tar programına benzer argümanlar alır.

örneğin. bir arşivin içeriğini listele

curl https://my.example.com/file.Zip | jar t

Java her zaman yüklü olmasa da, bulunduğu makinelerde jar kesinlikle bunu yapmanın en uygun yöntemidir.

4
Adrian

En yaygın OSS uygulaması olan Info-Zip ile mümkün değildir. Daha da önemlisi, Zip arşivlerinin yapısı nedeniyle önerilmez.

Biçim değişikliği sizin için geçerliyse, bunun yerine tar (1) kullanmayı düşünün. Akan giriş/çıkıştan oldukça memnun ve aslında bunu varsayılan olarak bekliyor.

Ayrıca, bir dosya adı için "-" belirterek uygulamaların akışlı girdi/çıktı bekleyip beklemediğini sık sık söyleyebilirsiniz. Info-Zip, tahmin edebileceğiniz gibi, bunu geçerli bir argüman olarak görmüyor.

4
Dan Carley

Repost cevabım :

BusyBox'ın unzip stdin alabilir ve tüm dosyaları ayıklayabilir.

wget -qO- http://downloads.wordpress.org/plugin/akismet.2.5.3.Zip | busybox unzip -

unzip öğesinden sonraki kısa çizgi stdin'i girdi olarak kullanmaktır.

Hatta,

cat file.Zip | busybox unzip -

Ama bu sadece unzip file.Zip.

Dağıtımınız varsayılan olarak BusyBox kullanıyorsa (örn. Alpine), unzip -.

3
Saftever

Aslında biraz daha karmaşık bir şeye ihtiyacım vardı - varsa belirli bir dosyayı ayıklayın. Zorluk, giriş dosyası akışı bir Zip dosyası olmayabilir ve bu durumda, borudan devam etmek için ona ihtiyacım vardı. İşte benim çözümüm (çoğunlukla Jason R. Coombs çözümü sayesinde)

python -c "import zipfile,sys,StringIO
data=sys.stdin.read()
try:
    z=zipfile.ZipFile(StringIO.StringIO(data))
    z.open(\"$1\")
    sys.stdout.write(z.read(\"$1\"))
except (RuntimeError, zipfile.BadZipfile):
    sys.stdout.write(data)"

Bu benim makine "/ bin" klasöründe "effpoptp" (basit bir ad değil) adlı bir dosya olarak kaydetti, böylece test şöyle:

cat defaultModel.mwb|effpoptp "document.mwb.xml"

Amaç, MySQL Workbench dosyalarının sürüm kontrolüdür; burada dosya, tezgah dosyası olarak adlandırılan xml dosyası veya komple tezgah dosyası olabilir.

1
SEoF