Официальная возможность получить лицензионный софт бесплатно.
Giveaway of the Day
Это не реклама!

Щелкните для получения прогноза по Биробиджану


понедельник, 6 июля 2015 г.

Групповая обработка файлов с похожими именами

Сервер OCS Inventory позволяет сохранять полученные от клиентов данные в виде отдельных файлов с расширением .ocs. Это может быть полезно для анализа истории изменений конфигурации. Но вот незадача: файлы плодятся гораздо быстрее кроликов и вскоре отведенный под них каталог забит файлами с именами вида "КОМП-дата-время-номер.ocs",  например, "computer017-2014-11-02-09-17-1.ocs", где "дата" и "время" - дата и время создания записи об этом компе. То есть, имена файлов с информацией об одном компьютере отличаются только полем "номер", причем в первом файле из серии это поле отсутствует.
Надо бы как-то навести порядок и хранить историю в архивах, поскольку нужна она только человеку - сама OCS хранит ее в БД MySQL.

Возникает задача: как упаковать файлы истории в отдельный для каждого клиента архив?



На помощь приходит великий и могучий баш сотоварищи.

for a in `ls *.ocs|sed -e 's/-[0-9\-]*.ocs//g'|uniq`; do 7z a $a $a*.ocs; done

На выходе получаем сколько-то архивов, причем имя каждого архива соответствует полю КОМП в каждом из упакованных в него файлов. Разберём этот оператор по частям

for a in  ... done

самоочевидно - обычный цикл, где переменная $a получает значения из некоторого списка.

do 7z a $a $a*.ocs;
тоже не вызывает проблем: архиватором 7zip упаковываем файлы с именем $a.ocs в архив с именем $a[.7z].

Волшебство содержится в команде описания списка значений для переменной $a. Обратные апострофы (обычно верхняя левая клавиша, содержит тильду и обратный апостроф для латинской раскладки и букву "ё" для русской) обозначают, что надо в качестве списка использовать вывод заключенной в них команды.

ls *.ocs
вопросов не вызывает - просто показать список имеющихся файлов с расширением .ocs и передать его по конвейеру следующей команде.

sed -e 's/-[0-9\-]*.ocs//g'
строчный редактор sed много чего умеет по части автоматической обработки текстов. В данном случае мы ищем фрагмент текста "дефис-сколько_угодно_цифр_и_дефисов-точка-ocs", и глобально заменяем его на ничто, то есть, удаляем. Это значит, что при просмотре переданного ему имени файла, sed удалит из него всё, что идет сразу после поля КОМП.
Последний параметр "g" - "глобальный поиск" в данном случае не обязателен, поскольку такая последовательность символов может встретиться в имени файла только один раз.
Даже если дефис используется в имени компьютера, то проблемы могут возникнуть только когда имена компьютеров имеют вид "комп-номер". В таком случае придется писать несколько операторов поиска и замены, возможно даже несколько разных циклов, чтобы обработать такую ситуацию.

uniq
Замечательная команда оставляет из переданного ей длинного списка значений только неповторяющиеся, например, из списка "1 2 3 3 4 5 3 2" останется только "1 2 3 4 5", поскольку последние "3" и "2" уже есть в списке. Предыдущая команда вернет длинный список имен компов, в котором будет куча дублей, но нам-то нужны уникальные имена. Этим и займется uniq.

Собственно, всё: каждое значение КОМП будет по одному разу использовано для создания архива с таким именем и упаковки в него файлов с именами КОМП*.ocs

Комментариев нет:

Отправить комментарий

Пожалуйста, воздержитесь от грубостей и персональных нападок.
Я не против матерщины, но она должна быть уместной и использоваться для выражения эмоций, а не в качестве основного средства выражения мыслей.