Üst dizini eklemeden bir arşivi sıkıştırın


30

Bunun gibi bir dizin ağacındaki birçok klasörü sıkıştırmak istiyorum

V-
 something.txt
 folder
 folder
 g.jpg
 h.jar

Sıkıştırmaya çalıştığımda, içeriği (alt dizinler ve dosyalar) yerine v klasörü ile birlikte bir zip arşivi oluşturmaya son veriyor

Bundan nasıl kaçınabilirim?

Yanıtlar:


23

Yani doğru anlarsam, belirli bir klasördeki dosyaları ve klasörleri arşivlemeye çalışıyorsunuz, ancak kök klasörü eklemeden çalışıyorsunuz.

Örnek:

/test/test.txt
/test/test2.txt

burada test.txt ve test2.txt zip içinde saklanır, ancak / test /

/ Test / dizinine girip sonra şöyle bir şey çalıştırabilirsin,

zip -r filename.zip ./*

Bu da filename.zip adlı aynı klasörde bir arşiv oluşturur. Veya çalıştırabileceğiniz klasörün dışından çalıştırıyorsanız,

zip -r test.zip test/*

/ *, Klasörün tamamı yerine yalnızca klasör içeriğini içeren kısımdır.

Düzenleme: OP birden fazla fermuar istedi, çözüm biraz kesmek oldu, bunu yapmanın daha iyi bir yolu olup olmadığını merak ediyorum.

for d in */ ; do base=$(basename "$d") ; cd $base ; zip -r $base * ; mv "${base}.zip" .. ; cd .. ; done;

evet ama aynı şeyi yaptığım bir sürü dosyam var, bu yüzden bunu sıkıcı bir şekilde yapmalı, böylece bir bash betiği ya da tüm klasörleri içeren dizinde aynı işlemi otomatikleştirecek bir şey var
Dami

1
Tamam Senaryoyu çalıştırdım ve arşivdeki bir ana dizini yarattım, arşivdeki sadece içeriğin arşivde olmasını istiyorum
Dami

1
Benim hatam, biraz özledim. Sadece baktım bir -j parametresi ekledi, görünüşe göre istemediğiniz kısmı atlar. Bu deneyinfor d in */ ; do base=$(basename "$d") ; zip -rj "${base}.zip" "$d" ; done;
zzbomb

18
zip -r test.zip test / * dışardan zip dosyasını dizin olarak test olarak ekler
smihael

4
@smihael'ın dediği gibi zip -r test.zip test/*çalışmıyor. Bunu dizinin dışından elde etmenin doğru bir yolu var mı?
andrhamm

22

Kullanın -jveya --junk-pathsZip komut seçeneği.

Gönderen zip adam sayfası :

-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).

Bu doğru cevap gibi görünüyor.
mutant_city

3
Ancak iç içe geçmiş yollar / klasörler ne durumda?
GuyPaddock

3
Bu, arşivdeki tüm klasörleri atlar ve farklı klasörlerde yinelenen dosya adlarınız varsa, bu patlar. Bunun bir yeri var, ancak sadece klasörleri önemsemiyorsanız ve sadece dosya istiyorsanız OP'nin istediği şey değildi, ama yine de iyi bilgi
Govind Rai

17

Bu komuttan ne haber?

$ cd somedir ; zip -r ../zipped.zip . * ; cd ..

5
Bu doğru bir cevap olsa da, giriş kendinizi ikna olmuş gibi görünmüyor. Ayrıca komutun ne yaptığını da biraz açıklamaya yardımcı olacaktır.
Nephente

1
Bu benim de çözümümdü, ama içerdiği için hoşuma gitmiyor cd. Saklanan yolu daha kesin olarak belirtmenin bir yolu olduğunu umuyordum.
nilskp

3

Bu yardımcı olur umarım.

(cd directory && zip -r ../out.zip .)

Ana kabuğu aynı dizinde tutar ve yalnızca komuttan sonra ölen alt kabuğun dizinini değiştirir.


Bunu @Alfred UC'nin cevabına yorum olarak eklemek istedim ama bunun için yeterli itibarım yok.
Kenneth

Aslında sorunu çözerse, o zaman bir çözüm olabilir.
Yufenyuy Veyeh Dider

Bu bir cevap olarak daha iyidir. Bu hem bas hem de sh olarak çalışır mı?
Arlen Beiler
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.