Разархивируйте все файлы в каталоге

203

У меня есть каталог файлов ZIP (созданный на машине Windows). Я могу вручную распаковать их, используя unzip filename, но как я могу распаковать все файлы ZIP в текущей папке через оболочку?

Использование Ubuntu Linux Server.

Ленни де Вилльерс
источник

Ответы:

395

Это работает в Bash, по этой ссылке :

распаковать \ *. zip

ChristopheD
источник
2
Мне нужна была обратная косая черта с Zsh . Я не знаю причину, по которой вам это нужно, если вы используете Bash.
Дон Маккарди
Что будет с дубликатами файлов? Я думаю, это просто переопределит?
kerner1000
Отлично работает на macOS A
Ahi Tuna
1
При этом я получаю имя файла не совпадает со всеми файлами zip в каталоге
thebeancounter
1
Версия с кавычками у меня работала на WSL. Имена файлов также содержат пробелы, FWIW.
Макс Кандокия
107

Просто вставьте несколько цитат, чтобы избежать подстановочного знака:

unzip "*.zip"
ghostdog74
источник
2
+1 Этот работал для меня. Мне пришлось распаковать имена файлов с определенным форматом, ограничивая остальные. Я просто сохранил соответствующий формат в двойных кавычках, и он работал как шарм. Вывод сообщает мне количество архивов, успешно обработанных.
Лалит Кумар Б
Прекрасно работал в подсистеме Ubuntu для Windows, 18.11.2008. Топ ответ не сработал.
Julianstanley
64

Следующий скрипт bash извлекает все zip-файлы в текущем каталоге в новые dir-файлы с именем файла zip-файла, то есть:

Следующие файлы:

myfile1.zip
myfile2.zip 

Будет извлечено для:

./myfile1/files...
./myfile2/files...

Сценарий оболочки:

#!/bin/sh
for zip in *.zip
do
  dirname=`echo $zip | sed 's/\.zip$//'`
  if mkdir "$dirname"
  then
    if cd "$dirname"
    then
      unzip ../"$zip"
      cd ..
      # rm -f $zip # Uncomment to delete the original zip file
    else
      echo "Could not unpack $zip - cd failed"
    fi
  else
    echo "Could not unpack $zip - mkdir failed"
  fi
done
CONvid19
источник
4
Это вещь, чтобы победить все. Не могу поверить, что это не проголосовало выше
Billynoah
Это не касается пробелов в именах файлов.
Дэвид Оливер
1
Просто добавьте цитаты "к имени файла
CONvid19
1
`спас мой день! Спасибо! Я делаю какой-то цикл, разархивирую, выполняю действие, копирую, что-то grep, удаляю. Не хватало того, как перейти от file.gz к файлу в качестве переменной в скрипте bash
thahgr
38

распакуйте * .zip, или если они находятся в подпапках, то что-то вроде

find . -name "*.zip" -exec unzip {} \;
phatmanace
источник
unzip выполняет обработку символов подстановки, поэтому файл с именем * .zip не будет выполнять то, что вы ожидаете.
геокар
3
На самом деле это будет делать именно то, что ожидается, результат операции поиска передается в распаковку
Джон Баргман
1
При этом будут извлечены все zip-файлы в текущем каталоге, что если я хочу, чтобы zip-файлы (присутствующие в подпапках) были извлечены в соответствующие подпапки?
Ришабх Аграри
2
@RishabhAgrahari Я ответил на ваш комментарий в новом ответе .
Jojo
для gzip'edфайлов используйте gunzip -rfk .для рекурсивного распаковывания внутри соответствующих папок
Devaroop
17

Разархивируйте все .zipфайлы и сохраните содержимое в новой папке с тем же именем и в той же папке, что и .zipфайл:

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

Это расширение ответа @ phatmanace и адреса @ RishabhAgrahari :

При этом будут извлечены все zip-файлы в текущем каталоге, что если я хочу, чтобы zip-файлы (присутствующие в подпапках) были извлечены в соответствующие подпапки?

Jojo
источник
1
для gzip'edфайлов используйте gunzip -rfk .для рекурсивного распаковывания внутри соответствующих папок
Devaroop
2
Начало find: illegal option -- nиспользования UnZip 6.00 - кто-нибудь еще?
DannyDannyDanny
find . -name '*.zip' -exec sh -c 'unzip -d "${1%.*}" "$1"' _ {} \;Вы забыли список каталогов.
SaundersB
16
for i in *.zip; do
  newdir="${i:0:-4}" && mkdir "$newdir"
  unzip "$i" -d  "$newdir"
done

Это позволит распаковать все ZIP-архивы в новые папки с именами файлов Zip-архивов.

a.zip b.zip c.zipбудет распакован в a b cпапки соответственно.

Jahid
источник
6

aunpack -e *.zip, с atoolустановленным. Преимущество в том, что он работает с ошибками и всегда распаковывает в подкаталоги, если zip не содержит только один файл. Таким образом, нет опасности загрязнения текущей директории массами файлов, как в случае с unzipzip без структуры каталогов.

kampu
источник
6

В любой оболочке POSIX это разархивирует в отдельный каталог для каждого zip-файла:

for file in *.zip
do
    directory="${file%.zip}"
    unzip "$file" -d "$directory"
done
Джефф Фишер
источник
1
Или как однострочник:for file in *.zip; do unzip "$file" -d "${file%.zip}"; done
peterflynn
2

Использовать это:

for file in `ls *.Zip`; do
unzip ${file} -d ${unzip_dir_loc}
done
Анкит Малхотра
источник
2

for file in 'ls *.zip'; do unzip "${file}" -d "${file:0:-4}"; done

Анураг Даля
источник
1
Здорово для меня. Распакуйте в их подпапки соответственно
insign
Безопаснее просто делать for file in *.zip; do ...правильно?
peterflynn
1

Если файлы есть gzip'd. Тогда просто используйте:

gunzip -rfk .

из корневого каталога для рекурсивного извлечения файлов в соответствующих каталогах, сохраняя исходные (или удаляя, -kчтобы удалить их)

Devaroop
источник
0

Это вариант ответа Педро Лобито, в котором используется рекурсивный цикл по каталогу для удаления файлов с определенными инструкциями расширений :

shopt -s globstar
root_directory="."

for zip_file_name in **/*.{zip,sublime\-package}; do
    directory_name=`echo $zip_file_name | sed 's/\.\(zip\|sublime\-package\)$//'`
    printf "Unpacking zip file \`$root_directory/$zip_file_name\`...\n"

    if [ -f "$root_directory/$zip_file_name" ]; then
        mkdir -p "$root_directory/$directory_name"
        unzip -o -q "$root_directory/$zip_file_name" -d "$directory_name"

        # Some files have the executable flag and were not being deleted because of it.
        # chmod -x "$root_directory/$zip_file_name"
        # rm -f "$root_directory/$zip_file_name"
    fi
done
пользователь
источник
-2
for i in `ls *.zip`; do unzip $i; done
Dominik
источник
14
Опасное использование Ls. Что делать, если у вас есть файл с именем "-j -o -d .. jackass.zip"
geocar
-2

Чтобы разархивировать все файлы в каталоге, просто введите этот cmd в терминале:

unzip '*.zip'
Yacine ELgoub
источник
Этот ответ является дубликатом stackoverflow.com/a/2376135/6948900
Михаил Антонов
-3

использование

sudo apt-get install unzip 

unzip file.zip -d path_to_destination_folder

разархивировать папку в linux

Мохит Сингх
источник
Это распакует только один файл. Вопрос в том, чтобы разархивировать все папки
Vivek Panday
Честно говоря, заголовок «Разархивировать все файлы в каталоге» может быть неоднозначным, а также означать «Разархивировать один архив в отдельный каталог».
jdersen