Форум русскоязычного сообщества Ubuntu


Получить помощь и пообщаться с другими пользователями Ubuntu можно
на irc канале #ubuntu-ru в сети Freenode
и в Jabber конференции ubuntu@conference.jabber.ru

Автор Тема: Как написать скрипт для массовой распаковки ZIP архивов  (Прочитано 2864 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Heswi

  • Автор темы
  • Новичок
  • *
  • Сообщений: 3
    • Просмотр профиля
Доброго времени суток.
Только начинаю разбираться в BASH поэтому прошу помощи. Встала задача автоматически распаковать более 800 архивов. Есть папка в которой есть вложенные папки в которых, в свою очередь, тоже могут быть вложенные папки. Необходимо чтобы скрипт рекурсивно обошел все папки и нашел в них файл с расширением *.zip. Затем в папке, в которой был найден архив, нужно создать папку photo и распаковать в нее содержимое архива после чего сам архив удалить. Я понимаю, что нужно использовать цикл, но как это сделать пока еще не понял. Буду очень благодарен за примеры.

Оффлайн peregrine

  • FSM
  • СуперМодератор
  • Старожил
  • *
  • Сообщений: 7203
  • Gentoo x64 Ubuntu 16.04.1 x64
    • Просмотр профиля
Код: (bash) [Выделить]
#!/bin/bash
extract_archive()
{
    input="$1"
    #тут пишешь команду для распаковки, в переменной $input у тебя будут имена файлов на распаковку
}
export -f extract_archive
find -type f -iname '*.zip' | parallel --no-notice extract_archive '{}'
#parallel даст одновременно запускать распаковку стольких архивов, сколько ядер, если я не ошибаюсь. Ключем -j можешь задать конкретно сколько параллельно тебе надо распаковывать. Можешь выпилить parallel из этой схемы, если тебе это не надо, я так картинки обрабатываю и мне parallel нужен для ускорения, у тебя наверно жесткий будет тонким местом и тебе он не нужен.
Как-то так и никаких глупых циклов для рекурсивного поиска.
Субдиректории создавай сам и удаляй сам архивы после распаковки в функции для распаковки архива.
Обновил, забыл про export.
« Последнее редактирование: 03 Июля 2017, 00:20:16 от peregrine »

Оффлайн Heswi

  • Автор темы
  • Новичок
  • *
  • Сообщений: 3
    • Просмотр профиля
peregrine, спасибо большое. Подскажите еще, пожалуйста, как мне узнать имя папки в которой создать субдиректорию? Можно ли сделать так?
# Получить путь (часть от начала строки до последнего слева слеша)
$ fullpathname="/root/temp/file.tar.gz"; echo "${fullpathname%/*}"
/root/temp
« Последнее редактирование: 03 Июля 2017, 00:53:48 от Heswi »

Оффлайн peregrine

  • FSM
  • СуперМодератор
  • Старожил
  • *
  • Сообщений: 7203
  • Gentoo x64 Ubuntu 16.04.1 x64
    • Просмотр профиля
Heswi, в $input полный путь к архиву, т.е. отрезай от конца имя файла и получишь директорию. Думаю, что проще всего отрезать по /, честно говоря, я с bash не бог весть как хорошо дружу, т.к. скрипты пишу достаточно редко, по необходимости (более-менее серьезный скрипт не на 5 строчек я писал год назад) и по памяти не помню, что и как происходит с echo "${fullpathname%/*}". Правильнее всего прочитать это, скорее всего там есть ответ на все вопросы по башу, которые обычно приходят в голову.

Оффлайн Azure

  • Модератор раздела
  • Старожил
  • *
  • Сообщений: 6017
  • Windows10, i3wm on Debian9, Manjaro20.0
    • Просмотр профиля
find -type f -iname '*.zip' -execdir bash -c 'mkdir -p photo ; unzip -d photo {}' \;
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

 

Страница сгенерирована за 0.034 секунд. Запросов: 25.