[SHELL] Извлечение файлов из архива

Столкнулся с такой ситуацией: в каталоге лежит несколько файлов - архивов. Их надо разархивировать. Если в скрипте указать так: # tar zxvf *.zip, то архиватор не работает. Пришлось думать о том, как произвести извлечение файлов из нескольких архивов. Первое, что пришло в голову - это массив. То есть, считать все имена файлов, которые лежат в каталоге и создать условие, с которым будет излвекаться несколько файлов. По крайней мере так это работает, если делать на perl.

В shell создание массивов - штука странная. По крайней мере в память такое я засунуть не смог, но...есть возможность этот список передать в файл. То есть мы можем создать один или несколько временных файлов, для работы скрипта, а потом их удалить :) Получается аналог того же двумерного массива, который создаётся, как в любом другом языке программирования, но он лежит не в памяти, а в файле. Почему файлы? Это очень удобно для отладки скрипта. Итак имеем:

Задача

Каталог в котором лежит несколько архивов: mgrp0316.zip, mgrpdop.zip

Решение

1. Анализ файлов. Как мы видим, у нас в каталоге два файла, запакованные архиватором ZIP. У этих файлов есть одинаковая общая часть - mgrp. То есть, если маскировать, то получим: mgrp*.zip. Получаем следующее - mgrp<там где звёздочка - любое текстовое или циферное выражение>.zip. Значит, в скрипте будет участвовать запись в таком виде: mgrp*.zip. После того, как вы напишите такую маску, файлы, кроме тех, как вы описали, обрабатываться не будут.

2. Алгоритм. Вторым пунктом у нас пойдёт проработка алгоритма, как будет отрабатываться скрипт.

Пишем псевдокод.

С помощью других скриптов, в наш рабочий каталог попадают файлы mgrp0316.zip, mgrpdop.zip. Перед запуском процесса извлечения надо узнать, что у нас лежит в каталоге. Если в этом каталоге могут лежать другие файлы, которые нам не нужны, то мы можем не привлекать их к обработке. Делается это с помощью команды ls. Как мы помним, для того, чтобы поместить результат команды в файл, нужно открыть дескриптор с помощью значения команды "> файл".

ls из Wikipedia:

Команда ls сначала выводит список всех файлов (не каталогов), перечисленных в командной строке, а затем выводит список всех файлов, находящихся в каталогах, перечисленных в командной строке. Если не указано ни одного файла, то по умолчанию аргументом назначается '.' (текущий каталог). Опция -d заставляет ls не считать аргументы-каталоги каталогами. Будут отображаться только файлы, которые не начинаются с '.' или все файлы, если задана опция -a.

Каждый список файлов (для файлов, которые не являются каталогами и для каждого каталога, содержащего список файлов) сортируется отдельно в алфавитной последовательности текущих региональных настроек (locale). Когда указана опция -l, то перед каждым списком выводится итоговая строка с общим размером всех файлов в списке, который измеряется в полу-килобайтах (512 байт).

Результаты печатаются на стандартный вывод, по одному файлу на строку, если с помощью опции -C не задан многоколоночный вывод. Однако при выводе на терминал не определено, будет ли вывод осуществляться в одну колонку или в несколько. Для задания одноколоночного или многоколоночного режима вывода могут использоваться опции -1 и -C, соответственно.

Итак, наша первая строчка:

ls -1 *.zip > filelist

Мы получаем список файлов в текущем каталоге и записываем этот список в файл filelist. Дальше, начинается самое интересное: Оператор цикла с перечислением. Этим оператором является команда FOR ("для"). Если перевести эту структуру на русский язык, получим следующее её описание:

Шаблон:

for имя [in список значений] do
список команд
done

По-русски:

ДЛЯ имя [in список значений] ДЕЛАТЬ
список команд
ВЫПОЛНИТЬ

Пишем следующую часть нашего скрипта:

for filename in 'cat filelist'
do
tar zxvf $filename > temp
mv temp newdir/$filename
done

В итоге, наши файлы будут разархивированы. Что означают in 'cat filename', а именно - cat, разберём потом, в будущем, так как это очень глобальная тема :)

Если ты не понял ни слова, из того, что было написано выше(может надо сменить кодировку?) или ты просто привык читать текст снизу вверх(бывает и такое), то мы ещё раз поясняем о чём этот материал. В материале рассказано, как создать скрипт, который для каждой не пустой строки в файле filename делает tar zxvf $filename > temp, после чего результат действия перемещается в файл temp в newdir, а затем переходит к следующей строке для повтора действий, но уже с другим(и) filename.

Так и только так, как написано в материале, будет работать и у тебя. Давай пробуй, но безо всякой самодеятельности. Любая самодеятельность обсуждается на нашем форуме :)




Ссылки:

К содержанию

© Copyright 2004-2017 - CMS Made Simple
Сайт работает на CMS Made Simple version 1.4.1

© Все печеньки Break-people.ru принадлежат авторам проекта.

Яндекс цитирования Рейтинг@Mail.ru Яндекс.Метрика