вівторок, 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 минуты, а польза огромная - за пару секунд конвертирует пачку файлов.

понеділок, 4 серпня 2014 р.

Разные полезности для новичков продвинутого уровня )

Наверное, вы уже ближе познакомились с миром никсов, возможно, даже выбрали себе дистрибутив. Покликали разные кнопочки, посмотрели все менюшки, но пора двигаться дальше. Можно конкретно облегчить себе жизнь, работу, зная хотя бы пару простых секретов и команд. Конечно, вам следует поискать хорошие книги, чтобы ознакомиться со всем глубоко и полностью. Здесь же покажу лишь нужные всем основы.
Как вы, уже поняли, всё делается через терминал. И если вы вдруг что-то ему плохое сделали, попутали переменные окружения, то необязательно закрывать его и запускать снова, можно ввести команду переинициализации:

$ reset

Если вы ввели команду, а потом оказалось что её надо было вводить с правами администратора, то самый быстрый путь:

$ sudo !!

!! - подставляет последнюю введённую команду.


Запуск HTTP-сервера в текущей директории на 8000 порту:

$ python -m SimpleHTTPServer

Допустим, вы делаете резервные копии руками, пока что без знаний о таких утилитах как rsync и других. Можно сравнить два каталога на наличие отличающихся файлов:

$ diff -qr dir1/ dir2/

Эта же утилита diff может просто сравнивать два файла и показать отличия построчно в удобочитаемом виде.
Сделать загрузочную флешку из большинства iso-образов (не все подходят под этот фокус) можно просто и легко:

$ dd if=/path/to/iso of=/dev/usbdevice

Главное, не перепутайте if и of (input - входящий, тобишь образ, output - исходящий, тобишь флешка). Показывать прогресса при этом не будет. Есть разные пути решения, один из вариантов (не надо ничего доустанавливать), открыть другую вкладку терминала и ввести:

$ watch -n 10 'killall -USR1 dd'

Это будет через каждых 10 секунд (watch -n 10) обновлять статус.
Копирование по ssh большой пачки файлов, как один файл, намного быстрее будет:

$ tar -czf - /some/dir | ssh host.name tar -xzf - -C /destination

Пока что хватит. Вам и так придётся много погуглить, чтобы до конца разобраться и освоить. И не забывайте про man pages.