Komut satırında birden çok dosyayı nasıl sıkıştırırım?


16

Bu en temel soruyu affedin, ancak yığın değişiminde doğrudan bir cevap veya basit bir örnek bulamadım.

Diyelim ki, korkunç Windows arkadaşlarımla paylaşabileceğim bir zip dosyasına sıkıştırmak istediğim bir dosya klasörünüz var (aksi takdirde sadece kullanmak tarve onunla yapmak istiyorum ). Şöyle görünüyor:

.
├── file1.txt
├── file2.txt
├── file3.txt
├── file.jpg
└── test.jpg

zipYüklediğimi varsayarak :

sudo apt-get install zip

man zipBir dosya listesi kullanmama izin verdiğini görüyorum :

- @ dosya listeleri. Bir dosya listesi - @ [MacOS'ta değil] olarak belirtilirse zip, giriş dosyalarının listesini komut satırından ziyade standart girişten alır. Örneğin,

          zip -@ foo

Ben zip.lstde şöyle bir şey yarattım :

cat zip.lst

file1.txt
file2.txt
file3.txt
file.jpg
test.jpg

Ve şimdi denedim:

zip -@ zip.lst

Ancak konsolda boş bir satır oluşturmak dışında hiçbir şey yapmadı. Ve itmeye devam edebilirim Enterve görünüşe göre komutu yerine getirmeden daha fazla boş satır yapmaya devam ediyor. Biraz arama yaptıktan sonra, Ctrl+ tuşlarına basarak girişi sonlandırmam gerektiğini fark ettim.D

Ama şimdi bu hatayı alıyorum:

    zip warning: missing end signature--probably not a zip file (did you
    zip warning: remember to use binary mode when you transferred it?)
    zip warning: (if you are trying to read a damaged archive try -F)

zip error: Zip file structure invalid (zip.lst)

Ne!? Basit listem nasıl "geçerli bir dosya yapısı" değil? Daha fazla bilgi için kılavuza geri döndüğümde daha yakından inceleyeceğim:

Eğer bir dosya listesi olarak belirtilir - @ ...

Bu yüzden onsuz deniyorum -@ve bu en azından Ctrl+ tuşuna basmadan hemen işliyor Dama aynı hatayla kaldım .

Neyse ki buldum bir yorum açıkça zip dosyasını adlandırmak için gerekli olduğunu fark götürdü neredeyse ilgisiz soruya bir cevap üzerinde. Bu hata varsayılan olarak adlı bir zip dosyası oluşturmaya çalıştığı için olur zip.lst. Ancak bu listemin adı olduğundan, listenin üzerine yazılacağını düşünebiliriz, ama hayır, aslında güncellemeye çalışıyordu. Ve liste açık bir şekilde zip dosyası olmadığından, geçersiz dosya yapısı hatası alıyoruz ve şimdi neden "muhtemelen bir zip dosyası değil" dediğini açıklıyor. Sonra denedim:

zip files.zip zip.lst

adding: zip.lst (deflated 35%)

Eureka! Zip dosyasının oluşturulduğunu ve klasörümün şimdi içerdiğini görebiliyorum:

.
├── file1.txt
├── file2.txt
├── file3.txt
├── file.jpg
├── files.zip
├── test.jpg
└── zip.lst

Ancak kutlamadan önce bekleyin, önce zip dosyasının içeriğini onaylayalım:

unzip -l files.zip

Archive:  files.zip
  Length      Date    Time    Name
---------  ---------- -----   ----
       48  2016-05-24 15:30   zip.lst
---------                     -------
       48                     1 file

Hayır! Aslında, standart kullanımdan mantıklı çünkü verdiğim bir liste dosyasını sıkıştırdı. Sonunda tekrar denedim -@ama aynı sonucu aldım.

Neyi yanlış yapıyorum?

BTW, GUI'yi kullanabileceğimi ve faremle yapabileceğimi biliyorum, ama bunu senaryolamam gerekiyor ve genel olarak ne yaptığımı bildiğimde CLI'de daha hızlıyım.

Yanıtlar:


23

Dosya <yönlendirmeyi kullan

zip files.zip -@ < zip.lst

Ya da listeyi atlayabilir ve sadece

zip files.zip *.txt *.jpg

teşekkürler steeldriver

Tarihsel Cevap

Ben memnunum 's Tamam benim kendi soruya cevap Ben gözyaşı benim izi geride aşağıdaki diğerleri bazı anahtar kelimeleri arayarak korunmuş ki umuduyla benim kargaşa chronicle istediğim için.

Sonunda, doğru cevabı buldum , ancak yanlış soruya gönderildi .

Birkaç netlik noktası:

  • Kılavuz, bir dosyadaki gibi gerçek bir listeye değil, tam anlamıyla dosyaları konsolda listelemeye atıfta bulunuyor.
  • Birinin foodosya listesine atıfta bulunan bir düşünceye yanlış yönlendirilebileceği anlaşılabilir , ancak aslında çıktı zip dosyasının adını temsil etmesi amaçlanmıştır.
  • Dosya listesi örnekte yok sayılmıştır, çünkü -@anahtarı kullanmaktadır, "girdi dosyalarının listesini komut satırı yerine standart girdiden alır "

Bunu anlayarak, şimdi hedefe ulaşmak için çeşitli yollar ile silahlandırılmış durumdayız.

Öncelikle oluşturduğumuz dosya listesini kullanarak, listeyi okuyabilir catve çıktıyı zip olarak standart girdi olarak bir boru ile yönlendirebiliriz:

cat zip.lst | zip -@ files.zip

  adding: file1.txt (stored 0%)
  adding: file2.txt (stored 0%)
  adding: file3.txt (stored 0%)
  adding: file.jpg (stored 0%)
  adding: test.jpg (stored 0%)

Gören adding: ...her dosya için kesinlikle iyi bir işarettir, ama biz önce öyleyse sadece onaylamak izin umutlarımız yaşadım:

unzip -l files.zip

Archive:  files.zip
  Length      Date    Time    Name
---------  ---------- -----   ----
        0  2016-05-24 14:54   file1.txt
        0  2016-05-24 14:54   file2.txt
        0  2016-05-24 14:54   file3.txt
        0  2016-05-24 15:00   file.jpg
        0  2016-05-24 14:59   test.jpg
---------                     -------
        0                     5 files

TATLI! Ama kim zaten bir kerelik kullanım listesi oluşturmak ister? Bu, bu özel senaryoyu çözmenin korkunç bir yoludur. Bir liste almak lsve sıkıştırmak için daha iyi olurdu :

ls | zip -@ files.zip

  adding: file1.txt (stored 0%)
  adding: file2.txt (stored 0%)
  adding: file3.txt (stored 0%)
  adding: file.jpg (stored 0%)
  adding: test.jpg (stored 0%)

Muhteşem! Şimdi grepsadece jpg'leri sıkıştırmanın müthiş gücüne sahip filtreler oluşturalım :

ls | grep .jpg | zip -@ images.zip

  adding: file.jpg (stored 0%)
  adding: test.jpg (stored 0%)

Veya sadece "dosya" ile başlayan dosyalar

ls | grep file. | zip -@ files.zip

  adding: file1.txt (stored 0%)
  adding: file2.txt (stored 0%)
  adding: file3.txt (stored 0%)
  adding: file.jpg (stored 0%)

5
Bunun yerine kullanmanın lsve grepve posta 's -@, zip komut satırı ör doğrudan dosyaları seçmek için kabuk globs kullanabilir zip files.zip file*veya zip images.zip *.jpg. Ayrıca, bir dosyadan dosya adları listesi kullanırken, ayrı bir kedi işlemi çağırmak yerine yeniden yönlendirme kullanabilirsiniz,zip files.zip -@ < zip.lst
steeldriver

Dosyaların yanında iç içe dizinlerle bu çalışmayı nasıl yapabilirsiniz?
BallpointBen

@BallpointBen Kullanmak findyerinels
Jeff Puckett

6

maksimum sıkıştırma seviyesi ile en basit komut

zip -9 -r filename.zip /path/to/dir singlefile.jpg 
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.