2013-10-29 23 views
6

Witam muszę rozpakować plik, który mógłby mieć katalog i chcę wykluczyć wszystko w tym katalogu, próbowałem wielu opcji i wyglądałem tu również, ale nie wydaje mi się znaleźć jakieś dobre rozwiązanie.linux unzip z wyłączeniem wszystkiego w folderze i pod

Są zawartość pliku zip: Uwaga głębokość WYKLUCZAJă folder jest nieznana, ale musimy wykluczyć wszystkiemu

$unzip -l patch2.zip 
Archive: patch2.zip 
    Length  Date Time Name 
--------- ---------- ----- ---- 
     0 2013-10-29 17:42 EXCLUDE/ 
     0 2013-10-29 17:24 EXCLUDE/inner/ 
     0 2013-10-29 17:24 EXCLUDE/inner/inner1.txt 
     0 2013-10-29 15:45 EXCLUDE/file.txt 
     0 2013-10-29 15:44 patch.jar 
     0 2013-10-29 15:44 system.properties 
---------      ------- 
     0      6 files 

Próbowałem tego polecenia, które tylko wyodrębnić pliki w nim, ale nie folder i jego zawartość:

$unzip -l patch2.zip -x EXCLUDE/* 
Archive: patch2.zip 
    Length  Date Time Name 
--------- ---------- ----- ---- 
     0 2013-10-29 17:42 EXCLUDE/ 
     0 2013-10-29 17:24 EXCLUDE/inner/ 
     0 2013-10-29 17:24 EXCLUDE/inner/inner1.txt 
     0 2013-10-29 15:44 patch.jar 
     0 2013-10-29 15:44 system.properties 
---------      ------- 
     0      5 files 

Dzięki za pomoc.

Odpowiedz

8

Musisz podać wzór wykluczenia, aby został przekazany do unzip. W przeciwnym razie zostanie rozszerzony przez powłokę, zanim zostanie przekazany do unzip.

Spróbuj:

unzip patch2.zip -x "EXCLUDE/*" 
+0

+1 za odpowiedź, ponieważ jest blisko pytania OP. Moja własna to po prostu "dobra do poznania" alternatywa ^^ (która jest teraz mało znana, podczas gdy była bardziej znana we wczesnych dniach Linuksa) –

+0

Dzięki temu działało idealnie. Czy możesz wyjaśnić, co masz na myśli, mówiąc: "zostanie przekazany do rozpakowania, w przeciwnym razie zostanie rozszerzony przez powłokę przed przekazaniem do rozpakowania". – Ravi

+1

@Ravi Przeczytaj o [Globbing] (http://tldp.org/LDP/abs/html/globbingref.html), który jest, gdy powłoka zamienia wzorce wieloznaczne na nazwy plików. np. gdy uruchomisz 'echo *', powłoka "rozszerza" '*' na listę nazw plików np. 'plik1',' plik2' itp przed uruchomieniem 'echo'. W rezultacie 'echo *' zmienia się w 'echo file1 file2'. Program 'echo' nigdy nie widzi symbolu wieloznacznego, widzi tylko argumenty' plik1' i 'plik2'. Ale jeśli zacytujesz wzór, echo, to powłoka nie wykona tego rozszerzenia, a wzorzec zostanie przekazany jako argument do programu, który może go zinterpretować, jakkolwiek wybierze. – dogbane

0

@dogbane odpowiedź jest prawo.

Ale jeszcze dodać inny [mam nadzieję] opcja interresting, jak jesteś na Linux:

mc 

(aka: Midnight Commandera)

go uruchomić, a następnie: na prawym panelu, przejdź do miejsca, w którym chcesz, aby Twoje pliki się skończyły, a na lewym panelu przejdź do "wewnątrz" pliku ZIP, a na tym pierwszym poziomie wybierz + skopiuj potrzebne rzeczy (np. zaznacz wszystko i usuń zaznaczenie folderu EXCLUDE, dla przykład)

mc jest BARDZO elastyczny i miły używać, szczególnie w plikach tar/untar/zip/move/delete/rename ... (w systemie Windows odpowiednikiem jest TotalCommander, a ja często używam opcji "synchronizuj", aby synchronizować kopie zapasowe i pochodzenie). Pozwala na nawigowanie po archiwach tak, jakby były nieskompresowane (starając się zminimalizować rzeczywistą dekompresję do tylko części "nawigacyjnej", aby nie rozpakowywać ich dwukrotnie).