Wyodrębnij kilka plików zip, każdy w nowym folderze o tej samej nazwie, przez terminal Ubuntu

36

Mam wiele plików zip a.zip, b.zip, c.zip, ... i chcę wyodrębnić każdy z nich do nowych folderów odpowiednio a, b, c, ... za pośrednictwem terminala.

Właściwie to, czego chcę, to rozwiązanie, z którego mogę później skorzystać, findponieważ mam wiele folderów 2014, 2013, 2012, ... każdy z nich zawiera wiele plików zip a.zip, b.zip itp. Jeśli to zrobię find . -name "*.zip" -exec {} unzip \;rozpakuje wszystkie pliki i umieści je w odpowiednim folderze nadrzędnym.

Michał
źródło

Odpowiedzi:

71

Powinieneś być w stanie użyć -dopcji rozpakowania, aby ustawić alternatywny katalog dla zawartości archiwum.

unzip -d a a.zip
unzip -d b b.zip

i tak dalej. W ramach findwyrażenia powinieneś być w stanie uzyskać nazwę katalogu z nazwy pliku zip za pomocą rozszerzenia parametrów powłoki, np.

find -name '*.zip' -exec sh -c 'unzip -d "${1%.*}" "$1"' _ {} \;

Najpierw przetestuj, dodając echoie

find -name '*.zip' -exec sh -c 'echo unzip -d "${1%.*}" "$1"' _ {} \;

lub coś w tym rodzaju

while read -rd $'\0' f; do 
  unzip -d "${f%.*}" "$f"
done < <(find -name '*.zip' -print0)
steeldriver
źródło
2
+1 za test it first…część
mrzmyr
2
findpotrzebuje katalogu, więcfind . -name ...
slf
@slf POSIXly, tak - ale nie w przypadku GNU find( . Zakłada się, że nie określono punktu początkowego .” )
steeldriver
10

Sam tego szukałem, ale zdałem sobie sprawę, że zrobiłem to już z innymi poleceniami i można to zastosować do niemal wszystkiego innego, tak jak już to robiłem.

Metoda znajdowania jest szalenie skomplikowana bez powodu.

for i in *.zip; do unzip "$i" -d "${i%%.zip}"; done
kencinder
źródło
Jest to najlepsza odpowiedź na dane pytanie. Poprzedni jest niedorzeczny, a następny nie sortuje do plików odpowiednich folderów głównych.
TheMegolith
W jaki sposób jeden przejść o tworzeniu katalogu bez z .zipprzyrostkiem? Prosić o przyjaciela.
deska rozdzielcza
Odpowiedź nie tworzy katalogu z sufiksem .zip, który jest samym punktem części nawiasów klamrowych.
kencinder
6

Po prostu użyj

unzip '*.zip' -d /home/user/folder/
James Muller
źródło
11
Chyba że coś mi umknie, to rozpakuje wszystko do / home / user / folder, a nie do / home / user / folder / a i / home / user / folder / b
M. Justin
1

Musiałem też to zrobić za pomocą unrar. Można to osiągnąć przez drobną modyfikację kodu Kencindera.

for i in *.rar; do mkdir "${i%%.rar}"; unrar x -r "$i" "${i%%.rar}"; done 

PS: Chciałem dodać to jako komentarz, ale nie mam wystarczającej liczby punktów reputacji!

Atul Singh Arora
źródło