вівторок, 12 серпня 2014 р.

Учимся писать полезные скрипты на bash

Сегодня учим делать полезные скрипты своими руками на одном практическом примере. Понадобилось как-то мне конвертировать пачку файлов из rst формата в docx. В браузере  на сервере rst рендерилось и отображалось как обычный html, тобишь уже такая автоматическая конвертация. Стянув пачку файлов, я получил хоть и с rst-расширением, но всё же в html коде. И это значит, надобно перевести в docx.
Итак, задача ясна, ищем решения. Немного погуглив, находим утилиту pandoc - http://johnmacfarlane.net/pandoc/demos.html
Умеет конвертировать фактически с любого языка разметки на любой другой.
Естественно, по одному файлу тыкаться как-то не хочется, разбираться может ли сам pandoc сделать групповую конвертацию - тоже влом. Решено быстро написать баш скрипт.
Для начала, надо перебрать все файлы с заданным расширением. Проверяем идею:

$ for fn in `find . -name "*.rst"`; do echo $fn; done
document1.rst
document2.rst
........
document10.rst

Часть вывода здесь опущена и вообще придумана :)
`find . -name "*.rst"` - поиск файлов по шаблону; если взять в эти кавычки, где знак "~", то подставится заместо команды вывод этой команды, то есть список всех найденых файлов. Ну и чтобы получить доступ к значению переменной, ставится знак "$".
Команда echo, грубо говоря, выводит указанное сообщение на консоль. В данном случае, выводит значение переменной fn.
Теперь, нам надо каждый найденный файл конвертировать и дать новое название. Сначала надо получить новое название. Поэтому теперь цикл будет выглядеть вот так:

for fn in `find . -name "*.rst"`
do
   new_fn=`basename $fn rst`docx
   echo $new_fn
done

Запишем этот цикл в файл, например group_converter.sh и запустим такой командой:

$ sh group_converter.sh
document1.docx
document2.docx
........
document10.docx

Отлично, теперь можно конвертировать. Изменяем файл:

for fn in `find . -name "*.rst"`
do
   new_fn=`basename $fn rst`docx
   pandoc -s -S -f html $fn -o $new_fn
done

Запускаем и видим что работает! Было бы неплохо навести красоту и возможность конвертировать с любого формата в любой. Но, здесь надо будет ключи подбирать (-s -S, для других форматов - другие ключи и т.п.), поэтому, скрипт может разрастить до таких нормальных размеров. А наша первоначальная задача выполнена. Поскольку, конвертировать группу файлов не каждый день приходится, универсализация скрипта может подождать. Последнее, что сделаем, это допишем информацию о скрипте:
#!/bin/bash
# Group markup coverter
# Usage:
#             copy this script to directory with files and run from inside

for fn in `find . -name "*.rst"`
do
   echo "Processing file: $fn"
   new_fn=`basename $fn rst`docx
   pandoc -s -S -f html $fn -o $new_fn
done
Вот такой вот скриптик делается буквально за 2 минуты, а польза огромная - за пару секунд конвертирует пачку файлов.

Немає коментарів:

Дописати коментар