Извлеките несколько zip-файлов, каждый в новую папку с тем же именем, через терминал Ubuntu

37

У меня много zip-файлов a.zip, b.zip, c.zip, ... и я хочу извлечь каждую из них в новые папки a, b, c, ... соответственно через терминал.

На самом деле мне нужно решение, которое я смогу использовать позже, findпоскольку у меня на самом деле много папок 2014, 2013, 2012, ... каждая из которых содержит множество zip-файлов a.zip, b.zip и т. Д. Если я это сделаю find . -name "*.zip" -exec {} unzip \;он распакует все файлы и поместит их в соответствующую родительскую папку.

Майкл
источник

Ответы:

72

Вы должны быть в состоянии использовать -dопцию unzip, чтобы установить альтернативный каталог для содержимого архива.

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

и так далее. В findвыражении вы должны иметь возможность получить имя для каталога из имени zip-файла, используя расширение параметра оболочки, например

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

Проверьте это первое, добавляя echoт.е.

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

или что-то вроде

while read -rd $'\0' f; do 
  unzip -d "${f%.*}" "$f"
done < <(find -name '*.zip' -print0)
steeldriver
источник
2
+1 за test it first…часть
mrzmyr
2
findнужен каталог, поэтомуfind . -name ...
slf
@slf POSIXly, да - но не в случае GNU find( «Если не указана отправная точка, .предполагается.» )
steeldriver
10

Я сам искал это, только чтобы понять, что уже сделал это с другими командами, и это можно применить практически ко всему, как я это уже делал.

Метод поиска сумасшедший слишком сложен без причины.

for i in *.zip; do unzip "$i" -d "${i%%.zip}"; done
kencinder
источник
Это самый лучший ответ на поставленный вопрос. Предыдущий нелеп и тот, который после этого не сортируется в файлы соответствующих корневых папок.
TheMegolith
Как бы один идти о создании каталога без с .zipсуффиксом? Просить друга.
Дашард
Ответ не создает каталог с суффиксом .zip, который является самой точкой части в фигурных скобках.
Кенциндер
6

Просто используйте

unzip '*.zip' -d /home/user/folder/
Джеймс Мюллер
источник
11
Если я что-то не упустил, это разархивирует все в / home / user / folder, а не в / home / user / folder / a и / home / user / folder / b
М. Джастин,
1

Мне также нужно было сделать это с помощью unrar. Это может быть достигнуто путем незначительного изменения кода kencinder.

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

PS: я хотел добавить это как комментарий, но у меня недостаточно очков репутации!

Атул Сингх Арора
источник