tek tek zip dosyalarına birden fazla dizini zipleme komutu


40

İçinde düzinelerce dizin içeren tek bir dizine sahibim.

Komut satırında yeniyim ve her bir alt dizini benzersiz bir sub- dizectory.zip dosyasına dönüştürecek bir komutla gelmeye çalışıyorum.

Sonunda, birincil dizinim, orijinal alt dizinlerimin tamamı .zipve her alt dizinin sıkıştırılmış içeriğini içeren ilgili dosyalar ile doldurulacaktır .

Böyle bir şey mümkün mü? Eğer öyleyse, lütfen bana nasıl yapıldığını göster.


"Döngüler" in kabukta nasıl yapılabileceğini aramanızı öneririm. İstediğinizi yapabilen çevrimiçi bağlantılar var, ancak güzel bir döngü daha net olacak.
lynxlynxlynx

Bu, ayrı bir kabuk betiği yazmam ve komut dosyasını komut satırından çağırmam gerektiği anlamına mı geliyor? Böyle temel bir soru için özür dilerim. Bazı programlama deneyimim olmasına rağmen, bu benim için yeni.
Evster

Yanıtlar:


75

Bu döngüyü içinde kullanabilirsiniz bash:

for i in */; do zip -r "${i%/}.zip" "$i"; done

idöngü değişkeninin adıdır. */Geçerli dizinin her alt dizini anlamına gelir ve bu isimlerde bir eğik çizgi bulunur. Bunu cdyapmadan önce doğru yere gittiğinizden emin olun . "$i"basitçe izleyen eğik çizgi dahil, bu dizini adlandırır. Tırnak işaretleri, dizin adındaki boşlukların sorun çıkarmamasını sağlar. ${i%/}olduğu gibi $iancak sondaki eğik çizgi kaldırıldı, bu yüzden zip dosyasının adını oluşturmak için bunu kullanabilirsiniz.

Bunun nasıl çalıştığını görmek istiyorsanız, echoönce bir ekleyin zipve yerine çalıştırılan komutları görürsünüz.


Teşekkürler bu harika görünüyor! Bununla birlikte, düşündüğüm olası bir sorun: Bu, her bir alt dizindeki TÜM dizinleri ayrı dosyalara ayıracak mı? Yalnızca 1. düzey alt dizinleri sıkıştırılmış tek dosyalar olarak sıkıştırmak istiyorum. 2. seviye, 3. seviye alt dizinler, vb. İçin ek zip dosyaları oluşturmak istemiyorum ... Lütfen anlamlı olup olmadığını bana bildirin. Tekrar teşekkürler!
Evster

Sadece senin gibi birinci seviye talep etti.
lynxlynxlynx

*/İsimleri her direkt alt dizin, her soyundan dizin. Böylece sadece en üst seviye için fermuarlar elde edersin, istediğin gibi. echoİçinde olan sürüm bu yönü gösterebilirdi. Yuvalanmış her dizini kendi dosyasına sıkıştırmak aslında daha fazla iş ve muhtemelen en iyi find -type dhileler arasında çözülmüş olacaktı .
MvG

1
@fritzmg: Linux'umdaki yerel bir test, evet, bir noktadan başlayan dosyaların dahil edildiğini gösteriyor. Bu, verdiğim komutun değil, Bilgi-Posta aracının bir özelliği olurdu, bu nedenle zipikiliğinizin ne olduğuna bağlı olarak farklı davranışlar alabilirsiniz. Nokta ile başlayan üst düzey dizinler (yani geçerli dizinin çocukları) için zip dosyaları oluşturmak amacıyla, shopt -s dotglobglob kalıplarının da gizli dosyalarla eşleşmesini sağlamak için kullanabilirsiniz .
MvG

1
Ana dizini kökleri olarak almayan bir zip oluşturmak için:for i in */; do (cd "$i"; zip -r "../${i%/}.zip" .); done
chris
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.