Sıkıştırılmış veya benzer programların standart çıktıda çalışmasını sağlayabilir miyim? Durum şu anda anında açılmış olması gereken bir zip dosyası indiriyorum.
İlgili sorun: İndirilen bir dosyayı bash'taki standart çıktıya nasıl aktarırım?
Sıkıştırılmış veya benzer programların standart çıktıda çalışmasını sağlayabilir miyim? Durum şu anda anında açılmış olması gereken bir zip dosyası indiriyorum.
İlgili sorun: İndirilen bir dosyayı bash'taki standart çıktıya nasıl aktarırım?
Yanıtlar:
Bir zip dosyası aslında bir kapsayıcı format olmasına rağmen, eğer dosya yeterince belleğe sığabiliyorsa, bir borudan (stdin) okunamamasının bir nedeni yoktur. Bir zip dosyasını standart girdi olarak alan ve içeriği geçerli dizine veya belirtilmişse belirtilen dizine çeken bir Python betiği.
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
.read()
yöntemi kullanarak hafızanın tamamını okuyorsunuz
Beklediğiniz gibi çalışması mümkün değildir. Zip yalnızca bir sıkıştırma biçimi değil aynı zamanda bir kapsayıcı biçimidir. Hem tar hem de gzip.bzip2'nin işlerini bir araya getirir. Zip'inizin tek bir dosyası varsa, dosyaları stdout'a çıkarmak için unzip -p komutunu kullanabilirsiniz. Birden fazla dosyanız varsa, nerede başladığını ve durduğunu söylemenizin yolu yoktur.
Stdin'den okuma gelince, unzip man sayfasının şu cümleyi var:
Standart girdiden okunan arşivler funzip dışında henüz desteklenmiyor (ve yalnızca arşivin ilk üyesi çıkarılabilir).
Funzip ile biraz şansınız olabilir.
Yapmak istediğiniz, unzip
argüman olarak değil, standart girişinde ZIPped bir dosya alın. Bu genellikle kolayca tarafından desteklenen gzip
ve tar
nazik bir ile araçların -
argüman. Ancak, standart unzip
bunu yapmaz (yine de, bir borunun çıkarılmasını destekler). Ancak, hepsi kaybolmaz ...
Bak funzip manuel sayfa.
dosya argümanı olmadan funzip, filtre işlevi görür; yani, 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ı ve bunun yerine kısa bir yardım metni gösterdiğini varsayar. Bir dosya argümanı varsa, giriş, stdin yerine belirtilen dosyadan okunur.
Tek üyeli çıkarma işlemindeki sınırlamalar göz önüne alındığında, funzip en çok tar (1) gibi ikincil bir arşivleme programı ile birlikte kullanışlıdır. Aşağıdaki bölüm, teybe disk yedekleme durumunda bu kullanımı gösteren bir örnek içerir.
Bu, çoğu linux arşivinin genellikle TAR'ed olduğu ve daha sonra bir şekilde ZIPPed olduğu fikrine uyuyor (gzip, bzip, et al). Eğer varsa, bu sizin için çalışacaktır tar.ZIP
.
funzip
Info-ZIP orijinal yazarı Mark Adler tarafından yazılmış olması dikkat çekicidir . Funzip man sayfasında yazıyor,
this functionality should be incorporated into unzip itself (future release).
ancak, böyle bir güncelleme görülmedi. Diğer arşivleme yöntemlerinin TAR ile kolayca çalıştığı için Mark'ın gereksiz bulduğundan şüpheleniyorum.
Curl kullanmayı severim çünkü varsayılan olarak yüklenir ( -L
genellikle oluşan yönlendirmeler için gereklidir):
curl -L http://example.com/file.zip | bsdtar -xvf - -C /path/to/directory/
Ancak, bsdtar
varsayılan olarak yüklü değil funzip
ve çalışamadım.
Bu, benzer bir soruya verdiğim cevabın bir kopyası :
ZIP dosya formatı arşivin sonunda bir dizin (dizin) içerir. Bu dizin, arşiv içindeki her dosyanın nerede bulunduğunu ve böylece arşivin tamamını okumadan hızlı, rasgele erişime izin verdiğini söyler.
Bir borudan bir ZIP arşivi okumaya çalışırken, indekse sonuna kadar erişilemediğinden ve bireysel üyeler dosya tamamen okunana ve artık bulunamayana kadar doğru şekilde ayıklanamadığı için bir problem ortaya çıkıyor gibi görünmektedir. . Bu nedenle, çoğu ZIP dekompresörünün, arşiv bir borudan beslendiğinde kolayca başarısız olması şaşırtıcı değildir.
Arşivin sonundaki dizin, meta bilgilerinin arşivde depolandığı tek yer değil . Ek olarak, bireysel girişler bu bilgiyi fazlalık amacıyla yerel bir dosya başlığında da içerir.
Her ZIP sıkıştırıcısı, dizin kullanılamadığında yerel dosya başlıklarını kullanmasa da, katran ve cpio önü libarchive (aka bsdtar ve bsdcpio) bir borudan okurken bunu yapabilir ve yapacaktır :
wget -qO- http://example.org/file.zip | bsdtar -xvf-
En yaygın OSS uygulaması olan Info-Zip ile mümkün değildir. Daha da önemlisi, ZIP arşivlerinin yapıları nedeniyle tavsiye edilmez.
Biçim değişikliği sizin için geçerliyse, bunun yerine tar (1) kullanmayı düşünün. Akışlı girdi / çıktıdan oldukça memnun ve aslında varsayılan olarak bekliyor.
Ek olarak, bir dosya adı için "-" i belirleyerek uygulamaların akışlı girdi / çıktı beklemesini bekleyebilirsiniz. Info-Zip, tahmin edebileceğiniz gibi, bunu geçerli bir argüman olarak değerlendirmiyor.
Zsh'de aşağıdakileri yapabilirsiniz:
unzip =( curl http://example.com/someZipFile.zip )
Bunu yapacak en basit ortak yardımcı program jar
, STDIN'in dosya argümanını geçmediğiniz takdirde kullanıldığını varsayar. Aynı zamanda tar
işlemler için programa 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, jar
olduğu makinelerde kesinlikle bunu yapmanın en uygun yöntemidir.
Cevabımın tekrarı :
BusyBox unzip
, stdin'i alabilir ve tüm dosyaları çıkarabilir.
wget -qO- http://downloads.wordpress.org/plugin/akismet.2.5.3.zip | busybox unzip -
Sonrasındaki çizgi unzip
, stdin'i giriş olarak kullanmaktır.
Yapabilirsin
cat file.zip | busybox unzip -
Ama bu sadece gereksiz unzip file.zip
.
Dağıtımınız varsayılan olarak BusyBox kullanıyorsa (örn. Alpine), sadece çalıştırın unzip -
.
Aslında biraz daha karmaşık bir şeye ihtiyacım vardı - eğer varsa belirli bir dosyayı çıkartın. Zorluk, girdi dosyası akışı bir zip dosyası olmayabilir ve bu durumda borudan geçmeye ihtiyacım vardı. İşte benim çözümüm (çoğunlukla Jason R. Coombs çözümü için teşekkürler)
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)"
Bunu, makinemdeki "/ bin" klasöründe "effpoptp" (basit bir ad değil) adlı bir dosya olarak kaydetmiştim.
cat defaultModel.mwb|effpoptp "document.mwb.xml"
Bunun amacı, dosyanın çalışma dosyası dosyası olarak adlandırılan xml dosyası veya tam çalışma dosyası dosyası olabileceği MySQL Workbench dosyalarını denetlemektir.