Dosya içeriğini çıkartın, ancak arşiv klasörü oluşturmadan


37

Çok sayıda dizin, dosya vb. İçeren bir dosya myarchive.zip var. Diyelim ki bu myarchive.zip dosyası "b" adlı bir dizinde yaşıyor. Eh, "unzip myarchive.zip" komutunu kullandığımda, sistem varsayılan olarak zip dosyasının içeriğiyle birlikte "myarchive" adlı bir dizin oluşturur. Ben do not sistemi bu "myarchive" dizinini oluşturmak istiyorum - Sadece içerikler "b" dizinine ayıklanmasını istiyoruz. Mümkün mü?

Şu anda yaptığım şey, dosyaları yeni oluşturulan dizinden (bu durumda "myarchive" - ​​"b") kopyalamak istediğim yere kopyalamak için bir "cp" komutu vermek.


8
Varsayılan olarak, unzipbir dizin oluşturmaz. Zip dosyanız muhtemelen dizini en üst düzeyde barındırıyor.
Chris Down

3
Sen kullanabilirsiniz mvyerine cp. mv archive/* .; rmdir archive/veya benzeri.
frostschutz

Yanıtlar:


45

Benim versiyonu unzipbir sahip -jherhangi bir dizin oluşturamadı seçeneği.

Yani

unzip -j /path/to/file.zip

zipDosyada depolanan dizin yapısını geri yüklemeden tüm dosyaları geçerli dizine çıkartır .

Yalnızca arşivden dizinleri bir seviye, (özü kaldırmak isterseniz myarchive/dir/fileolarak dir/filedeğil, file) şunu kullanabilirsiniz bsdtar(destekleri yapar ki zipek olarak dosya taryerine ve dosyaları) -sseçeneği.

bsdtar -xf /path/to/file.zip -s'|[^/]*/||'

8
Kullanırken -jarşiv dizin yapısını yeniden değildir ve tüm dosyaların ekstraksiyon klasöründe yatırılır. Bu, TÜM alt klasörlerin bırakıldığı anlamına gelir . Öyleyse zip/A/f1, zip/A/B/f2ve zip/A/B/C/f3f1, f2, f3 ile tek bir klasör ile sonuçlanacaktı. Farklı alt klasörlerde aynı ada sahip dosyalarınız varsa korkak olur. Genellikle en üstteki klasörü tüm dizin yapısını değil düşürmek istersiniz.
Cristian Vrabie

3
@ ChristianVrabie, cevapta söylediğim tam olarak bu. İstediğiniz şey için bir bsdtar alternatifi ekledim. Düzenlemeye bakınız.
Stéphane Chazelas,

2

Bu bsdtar ile gerçekten basit gibi görünüyor :

bsdtar --strip-components=1 -xvf file.zip


1

Kabul edilen cevabın ne yapılacağı belirtilmemiştir, soruda söylediğiniz gibi, zip dosyalarında saklanan klasör yollarını kullanmadan hala belirli bir klasöre çıkarmak istiyorsanız, -jseçeneği -dbu şekilde kullanabilirsiniz. :

unzip -j /path/to/file.zip -d other_folder

ya da davanız için

unzip -j myarchive.zip -d b

2
Bunu yapabilmen için haklısın; ancak alt dizinleri yaratmayacaktır, bu yüzden yine başka bir adım eklemelisiniz; OP'nin arşivin kök dizinini başka bir isimle yeniden adlandırmak istediğini ancak kalan yapıyı bu dizinin altında tutmak istediğinden eminim.
Pryftan

-1

Performans unzip myarchive.zip, myarchiveiçinde her şeyin bulunduğu bir dizin oluşturursa, bu, zip dosyasının yaratıcısının gerçekte o dizinde zip uyguladığı anlamına gelir.

İstediğinizi yaratmanın tek yolu, gerçekleştirdikten sonra tüm içeriği dizinin dışına taşımaktır unzip:

[user@host]:some/path/b$ unzip myarchive.zip

[user@host]:some/path/b$ ls{ dizini gösterirmyarchive }

[user@host]:some/path/b$ mv myarchive/* .

[user@host]:some/path/b$ rm -R myarchive

[user@host]:some/path/b$ ls{ (Doğrudan myarchive ilk seviyesini gösterir b) }


1
Ayrıca mv myarchive/.* ., .gitignore ve .htaccess gibi tüm gizli dosyaları taşımak için bir de gerekir .
Kinjal Dixit

1
@KinjalDixit Bu benim de düşüncemdi; Antoine, örneğinizde Kinjai'nin işaret ettiği gibi ölümcül bir kusur var: çünkü kullanıyorsunuz rm -Rve kullanmadığınız ls -aiçin herhangi bir nokta dosyası olup olmadığını göstermiyorsunuz; Şimdi kaçtığında rm -Rve nokta dosyaları olduğunda ne olacak ? Onları kopyalamadın, böylece kaybolmuşlar. Bunu gerçekten düzeltmelisin ve belki de farkı açıkla. ve şunu düşünün: ya sahip oldukları bir arşiv değilse? Ya da sıkıştırılmamış bir kez arşivi silmek için komuta eklerlerse?
Pryftan

Otoh rmdirönce boş olduğundan emin olur ... Ama kullanıcı nokta dosyaları hakkında bir şey bilmiyorsa, kafasını karıştırır.
Pryftan
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.