2013-02-11 19 views
9

Bir süredir çalışıyor ve bu oldukça yakın olduğuma inanıyorum, ama öyle bu zor bulgu olmuştur Unix için oldukça yeni edilmiştir.bütün fermuarlar bulun ve yerinde halletmek - Unix

Çok sayıda klasör içeren, içinde bazıları sıkıştırılmış dosyalara sahip olan, bazıları olmayan bir klasör var. Tüm alt dizinlerdeki zip dosyalarının tümünü unzip etmeye çalışıyorum. Örneğin

ben:

dosya/A/something.java

dosyaları/B/somezipfile.zip

dosya/C/someotherfile.zip

dosya/D/AnotherZipFile.zip

Onları çıkarmak için (fermuarlar sadece .java dosyaları içerdiğini varsayarak), aşağıdaki gibi bir sonuç elde etmek istiyorum: files/A/something.ja va

dosyaları/B/javafile.java

dosyaları/C/someotherfilefromzip.java

dosyaları/D/Anotherfile.java

ZIP dosyaları kalır veya eğer ben umursamıyorum unzipping sonra silindi, ya da iyidir. Şu ana kadar denediklerim var. Bu işe yaramazsa

find . -name *.zip | unzip 

:

1) Ben bu gibi yeni am boru tesisatı, kullanabilirsiniz bekleniyor. Onları yerinde halletmek istedim

find . -name '*.zip' -exec unzip '{}' ';' 

Bu unzips, ancak mevcut çalışma dizininin içine unzips:

2), arama biraz zaman geçirdim en yakın ben is online çözüm kullanarak gördü. Ben de öğrenmeye çalıştığım gibi istediğim bu komutu anlamıyorum.

Herhangi bir yardım çok takdir edilmektedir.

sayesinde

cevap

26
find . -name '*.zip' -exec sh -c 'unzip -d `dirname {}` {}' ';' 

Bu yinelemeli *.zip desen adları eşleşen dosyalar için geçerli dizinde ve alt dizinlerinde görünüyor emreder. dosya bulunamadı için bu iki parametre ile komut sh yürütür:

-c 

ve <filename> bulunmuştur dosyanın adıdır

unzip -d `dirname <filename>` <filename> 

. Komut sh, Unix kabuk yorumlayıcısıdır. Seçenek -c, sonraki argümanın kabuk betiği olarak yorumlanmasının kabuk olduğunu söyler. unzip kabuk çalışan değişik ikame yaparak, komut genişletir

unzip -d `dirname <filename>` <filename> 

önce: Yani kabuk aşağıdaki komut dosyasını yorumlar. Bu özel örnekte aslında dosya yerleştirilir dizin adı verir komutunun dirname <filename> çıkışı ile

`dirname <filename>` 

yerine koyar. Dosya adı ./a/b/c/d.zip Yani, eğer, kabuk böyle unzip bulaşır:

unzip -d ./a/b/c ./a/b/c/d.zip 

Eğer dosya adlarını veya dizin adları boşluk ZIP, bunu kullanın:

find . -name '*.zip' -exec sh -c 'unzip -d "`dirname \"{}\"`" "{}"' ';' 
+0

Bu iyi bir cevap gibi görünüyor, anlayabilmeniz için (çok hızlı) herhangi bir şansınız var mı? Biraz kafam karıştı, -exec ve {} işaretlerine olan ihtiyacım. – ThePerson

+1

Eklenen açıklama –

+0

Zip dosya isminde bir boşluk varsa bir sorunum var gibi görünüyor, bunun için kolay bir düzeltme var mı? – ThePerson

7
find . -name '*.zip' | xargs -n1 unzip 
19

kullanın -execdir yerine dosyasının bulunduğu dizindeki komutu çalıştıran -exec, find çalıştırdığınız dizini değil.

find . -name '*.zip' -execdir unzip '{}' ';' 
+0

Fevkalade çalıştı. '' {} '' Nin (dosya adı yer tutucu) ne yaptığını ve neden ''; '' 'in ayrı bir teklif olması gerektiğini açıklıyor musunuz? Teşekkürler! –

+0

{}, üzerinde çalıştığınız geçerli dosya anlamına gelir – Tebe