Zip dosyası oluştur ve dizin yapısını yoksay


218

Bu komutu kullanarak bir zip dosyası oluşturmak gerekir:

zip /dir/to/file/newZip /data/to/zip/data.txt

Bu çalışır, ancak oluşturulan zip dosyası ham dosyayı dizine taklit eden bir dizin yapısı oluşturur. İhtiyacım olmayan çok fazla klasör var.

Man sayfasına veya Google avına üstünkörü bir bakışta cevap bulamadım.



2
Bu sorunun diğer tüm yığın borsalarını önceden doldurduğunu düşünüyordum, ama ne yazık ki süpermarketin gönderisi aslında bundan daha eski. Bana yardımcı olmak için burada yapabileceğim bir şey varsa. Google hala burada çok fazla trafik çektiği için bu oldukça sıcak bir cevap olmalı. : D
Jake

Yanıtlar:


353

Kullanabilirsiniz -j.

-j
--junk-paths
          Store just the name of a saved file (junk the path), and do  not
          store  directory names. By default, zip will store the full path
          (relative to the current directory).

19
Eğer -j(birlikte Dizininizde için çalışma yapmaz -r) Kasaya bu cevabı
czerasz

bazen işe yaramaz ... tercih @czerasz bağlantı;) temelde bir pushd popd combo
TecHunter 28:16

36

Kullanmak seçeneği -jile birlikte çalışmaz -r.
Yani bunun için çözüm bu olabilir:

cd path/to/parent/dir/;
zip -r complete/path/to/name.zip ./* ;
cd -;

Veya satır içi sürüm

cd path/to/parent/dir/ && zip -r complete/path/to/name.zip ./* && cd -

Eğer çıktı yönlendirebilirsiniz /dev/nullEğer istemiyorsanız cd -çıktı ekranda görünmesini


Aslında, aşağıdakileri yapmak isteyebilirsiniz:cd path/to/parent/dir/ && zip -r ../../../../name.zip ./* && cd -
eddyP23 9

@ eddyP23 Nasıl bir fark yaratır? Aksine, hayır eklemenize neden olur. yolundaki her dizin için parentDir (..) 'in açıklaması: |
Vikas Tawniya

Sonuç aynı, katılıyorum. Ancak, birçok farklı ortamda çalışan otomatik komut dosyalarında, genellikle küresel yollardan kaçınırsınız, çünkü küresel yolun ne olacağı hakkında hiçbir fikriniz yoktur. Ancak cd path/to/parent/dir/çift ​​nokta sayısını ../kolayca hesaplayabilirsiniz .
eddyP23

@ eddyP23 mantıklı
Vikas Tawniya

33

-jSeçeneği kullanın :

   -j     Store  just the name of a saved file (junk the path), and do not
          store directory names. By default, zip will store the full  path
          (relative to the current path).


3

Alternatif olarak, dosyanızla geçici bir sembolik bağlantı oluşturabilirsiniz:

ln -s /data/to/zip/data.txt data.txt
zip /dir/to/file/newZip !$
rm !$

Bu, bir dizin için de geçerlidir.


1

Üst dizini öyle saklayın unzip dosyaları her yere yaymaz

Dizinleri sıkıştırırken, üst dizini arşivde tutmak, daha sonra arşiv dosyasını açtığınızda geçerli dizininizi kirletmekten kaçınmanıza yardımcı olur

Bu nedenle, tüm yolları korumaktan kaçınmak ve -j ve -r'yi birlikte kullanamadığınız için (bir hata alırsınız), bunun yerine bunu yapabilirsiniz:

cd path/to/parent/dir/;
zip -r ../my.zip ../$(basename $PWD)
cd -;

../$(basename $PWD)Üst dizini korur büyüdür.

Şimdi unzip my.ziptüm dosyalarınızı içeren bir klasör verecektir:

parent-directory
├── file1
├── file2
├── dir1
│   ├── file3
│   ├── file4

Geçerli dizine sıkıştırılmamış dosyalarla çöp vermek yerine:

file1
file2
dir1
├── file3
├── file4

0

Sadece -jrmdosya ve dizin yapılarını kaldırma seçeneğini kullanın

zip -jrm /path/to/file.zip /path/to/file

dikkatli olun, -m --move Belirtilen dosyaları zip arşivine taşıyın; aslında, belirtilen zip arşivi oluşturulduktan sonra hedef dizinleri / dosyaları siler. Dosyalar kaldırıldıktan sonra bir dizin boş kalırsa, dizin de kaldırılır. Zip arşivi hatasız olarak yaratana kadar hiçbir silme işlemi yapılmaz. Bu, disk alanını korumak için yararlıdır, ancak potansiyel olarak tehlikelidir, bu nedenle tüm giriş dosyalarını kaldırmadan önce arşivi test etmek için -T ile birlikte kullanılması önerilir.
catalint
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.