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


203

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

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

Ответы:


395

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

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


2
Мне нужна была обратная косая черта с Zsh . Я не знаю причину, по которой вам это нужно, если вы используете Bash.
Дон Маккарди

Что будет с дубликатами файлов? Я думаю, это просто переопределит?
kerner1000

Отлично работает на macOS A
Ahi Tuna

1
При этом я получаю имя файла не совпадает со всеми файлами zip в каталоге
thebeancounter

1
Версия с кавычками у меня работала на WSL. Имена файлов также содержат пробелы, FWIW.
Макс Кандокия

107

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

unzip "*.zip"

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

4
Это вещь, чтобы победить все. Не могу поверить, что это не проголосовало выше
Billynoah

Это не касается пробелов в именах файлов.
Дэвид Оливер

1
Просто добавьте цитаты "к имени файла
CONvid19

1
`спас мой день! Спасибо! Я делаю какой-то цикл, разархивирую, выполняю действие, копирую, что-то grep, удаляю. Не хватало того, как перейти от file.gz к файлу в качестве переменной в скрипте bash
thahgr

38

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

find . -name "*.zip" -exec unzip {} \;

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-файлы (присутствующие в подпапках) были извлечены в соответствующие подпапки?


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папки соответственно.


6

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


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 "${file:0:-4}"; done


1
Здорово для меня. Распакуйте в их подпапки соответственно
insign

Безопаснее просто делать for file in *.zip; do ...правильно?
peterflynn

1

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

gunzip -rfk .

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


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

14
Опасное использование Ls. Что делать, если у вас есть файл с именем "-j -o -d .. jackass.zip"
geocar


-3

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

sudo apt-get install unzip 

unzip file.zip -d path_to_destination_folder

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


Это распакует только один файл. Вопрос в том, чтобы разархивировать все папки
Vivek Panday

Честно говоря, заголовок «Разархивировать все файлы в каталоге» может быть неоднозначным, а также означать «Разархивировать один архив в отдельный каталог».
jdersen
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.