Jak wyodrębnić tylko określony folder ze spakowanego archiwum do danego katalogu?

59

Jak wyodrębnić określony folder ze spakowanego archiwum do danego katalogu?

Próbowałem użyć

unzip "/path/to/archive.zip" "in/archive/folder/" -d "/path/to/unzip/to"

ale to tworzy folder tylko na ścieżce, do której chcę go rozpakować i nic więcej nie robi.

Enkouyami
źródło

Odpowiedzi:

60
unzip <target-zip-file> '<folder-to-extract/*>' -d <destination-path> 

działa dobrze na EL 6

pozwać
źródło
3
co to jest EL 6?
Zelda
2
Enterprise Linux 6 (RHEL6) - Red Hat.
slm
To też działa; to w zasadzie ta sama odpowiedź, co Mark Adler, ale w nieco inny sposób.
Enkouyami,
@Enkouyami Minus różnice w cytowaniu, wygląda dokładnie tak samo.
Camilo Martin
1
@Enkouyami Ponieważ odwrotny ukośnik w podwójnych cudzysłowach ucieka przed znakiem (podobno gwiazdka jest uciekana, ale myślę, że to literówka), podczas gdy w pojedynczych cudzysłowach odwrotny ukośnik nie jest interpretowany. Jeśli ktoś chce literalnego odwrotnego ukośnika, "\\"byłby użyty (w przeciwnym razie zawsze trzeba pamiętać, które postacie są specjalnymi ucieczkami). Jest to różnica w cytowaniu, jeśli autor miał na myśli „cytowanie globalnego znaku” (niepotrzebne). Tak czy inaczej pojedynczy odwrotny ukośnik to literówka.
Camilo Martin
39

Próbować:

unzip /path/to/archive.zip 'in/archive/folder/*' -d /path/to/unzip/to
Mark Adler
źródło
4
zrobił to? Dostaję, caution: filename not matched: foldername/\*gdy uruchamiam, unzip $repozip "$2-master/\*" -d /srv/www/magento/gdzie $2jest nazwa folderu w
zipie
10
Działa bez \, tylko "path/*".
Alex
8
Czy istnieje sposób na wyodrębnienie zawartości „w / archive / folder / *”, która nie zachowuje ścieżki „w / archive / folder /”? W końcu używam mvpóźniej, aby uzyskać pliki tam, gdzie ich potrzebowałem.
jerrygarciuh
6
Użyj -jdo tego.
Mark Adler,
4
-jusuwa wszystkie informacje o ścieżce, a wszystkie pliki trafiają do folderu docelowego. Czy istnieje sposób na usunięcie tylko wspólnej części ścieżki? Podobne do zip -r.
Bob Stein,
6

Obie istniejące odpowiedzi są poprawne, ale określenie katalogu docelowego jest nieco trudne, co powinno być lepiej wyjaśnione.

Powiedzmy, że /target/root/jest katalogiem docelowym oryginalnej akcji rozpakowywania, np .:

unzip -qq src.zip -d "/target/root/"

Następnie musimy użyć tego samego /target/root/katalogu docelowego, nawet jeśli chcemy wyodrębnić tylko określony podkatalog, tak jak działa rozpakowanie:

unzip -qq src.zip "sub/dir/*" "/target/root/"

W końcu reguła jest naprawdę prosta, użyj tego samego docelowego katalogu głównego dla -dopcji .

Przy okazji, -qqopcja rozpakowania jest naprawdę cicha, możesz ją usunąć.

ryenus
źródło
Do Twojej wiadomości: <kbd> rozpakowałem -qq 2.3.zip "magento2-2.3 / vendor / *" "vendor /" </kbd> i otrzymałem <kbd> ostrożność: niezgodna nazwa pliku: vendor / `</kbd>. To jest instalacja Ubuntu w bash. Rzadko rozpakowuję, prawdopodobnie zrobiłem coś innego źle ...
Chris K,