Создайте отдельную папку для каждого zip-файла в каталоге и извлеките zip-файлы - PullRequest
47 голосов
/ 13 ноября 2011

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

Однако я бы хотел конвертировать несколько zip-файлов через оболочку. Но когда я делаю

unzip filename.zip

папка "filename" не создается, но все файлы извлекаются в текущий каталог.

Я посмотрел на параметры, но таких параметров нет. Я тоже пробовал

for zipfile in \*.zip; do mkdir $zipfile; unzip $zipfile -d $zipfile/; done

но расширение .zip в 2. $ zipfile и 4. $ zipfile должно быть удалено с помощью sed. Если я сделаю

for zipfile in \*.zip; do mkdir sed 's/\.zip//i' $zipfile; unzip $zipfile -d sed 's/\.zip//i' $zipfile/; done 

это не работает.

Как правильно заменить расширение .zip на $zipfile?

Есть ли более простой способ, чем сценарий оболочки?

Ответы [ 5 ]

84 голосов
/ 13 ноября 2011

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

Строка awk ниже должна сделать работу:

ls *.zip|awk -F'.zip' '{print "unzip "$0" -d "$1}'|sh

См. test ниже,

обратите внимание , что я удалил |sh в конце, так как мои архивы являются поддельными архивами;Я просто хочу показать сгенерированную командную строку здесь.

kent$  ls -l
total 0
-rw-r--r-- 1 kent kent 0 Nov 12 23:10 001.zip
-rw-r--r-- 1 kent kent 0 Nov 12 23:10 002.zip
-rw-r--r-- 1 kent kent 0 Nov 12 23:10 003.zip
-rw-r--r-- 1 kent kent 0 Nov 12 23:10 004.zip
-rw-r--r-- 1 kent kent 0 Nov 12 23:10 005.zip
-rw-r--r-- 1 kent kent 0 Nov 12 23:10 006.zip
-rw-r--r-- 1 kent kent 0 Nov 12 23:10 007.zip

kent$  ls *.zip|awk -F'.zip' '{print "unzip "$0" -d "$1}'
unzip 001.zip -d 001
unzip 002.zip -d 002
unzip 003.zip -d 003
unzip 004.zip -d 004
unzip 005.zip -d 005
unzip 006.zip -d 006
unzip 007.zip -d 007
43 голосов
/ 13 ноября 2011

«Извлечение здесь» - это просто особенность используемой вами оболочки unzip. unzip будет извлекать только то, что на самом деле находится в архиве. Вероятно, нет более простого способа, чем сценарий оболочки. Но sed, awk и т. Д. Для этого не нужны, если у вас есть POSIX-совместимая оболочка:

for f in *.zip; do unzip -d "${f%*.zip}" "$f"; done

(Вы НЕ ДОЛЖНЫ избегать расширения *, иначе расширение пути не будет иметь место.) Имейте в виду, что если ZIP-архив содержит каталог, например, с архивами Eclipse (которые всегда содержат eclipse/), вы в итоге с ./eclipse*/eclipse/eclipse.ini в любом случае. Добавьте echo перед unzip для пробного прогона.

8 голосов
/ 18 декабря 2014

Если у вас установлена ​​версия 7zip для командной строки p7zip, вы можете использовать:

7z x '*.zip' -o'*'
5 голосов
/ 18 апреля 2018

Добавьте имя папки и косую черту после переключателя, например:

unzip -d newfolder/ zipfile.zip

zip создаст папку 'newfolder' и распакует в нее архив.

Обратите внимание, что косая черта не требуется, но я думаю, что это просто по старой привычке (я использую Debian и Ubuntu).

1 голос
/ 04 мая 2016

aunpack из atool сделает это по умолчанию для всех видов архивов.

...