четверг, 3 июня 2010 г.

Обожаю командную строку!

Только с её помощью я могу на коленке написать нечто такое:

find . -name torrent | cut -d/ -f3 | sed -e 's/tor//g' - | \
sort -n | sed -e 's/^\(.*\)$/cp .\/ktorrent\/tor\1\/torrent \1.torrent/g' - | sh -

Что делает эта строчка?

Начну с начала. У KTorrent есть каталог, в котором хранится сохранённая сессия. Там же хранятся все torrent-файлы в каталогах типа ktorrent/torНОМЕР/torrent. Однажды KTorrent при добавлении очередного torrent-файла гавкнулся так сильно, что при каждом запуске моментально зависал, даже не отображая список torrent'ов. В результате этого я мог бы лишь удалять из каталога сессий файлы по одному и пытаться запустить KTorrent.

Но я решил забить на KTorrent и воспользоваться другими программами. Для этого мне нужно собрать все torrent-файлы в одном каталоге, чтобы потом их скопом добавить в новый torrent-клиент. В результате я написал приведённую выше строчку, которая обошла каталог сессии KTorrent, составила список torrent-файлов, вычленила номера torrent'ов, отсортировала их, сформировала для каждого torrent'а команду вида cp ./ktorrent/torНОМЕР/torrent НОМЕР.torrent и выполнила все эти команды в оболочке. Таким образом все torrent-файлы оказались собраны в одном месте.

Но и это ещё не всё. На работе я написал ещё несколько скриптов, помогающих мне в осуществлении плановой работы.

Например, следующий скрипт переименовывает пользователя в базе данных почтового сервера Postfix, переименовывает каталог с почтой и создаёт пересылку со старого адреса на новый, чтобы люди успели привыкнуть к новому адресу, прописать в адресные книги и т.п.

#!/bin/sh

MAILDIR='/var/mail/virtual'
DOMAIN='domain.ru'
USER=$1
USER_NEW=$2

if test x$USER = x -o x$USER_NEW = x
then
echo "Usage: rename_user.sh "
exit
fi

echo "Enter root password of mysql"

mysql -u root -p <<END
use mail;

update users set
login = '$USER_NEW@$DOMAIN',
maildir = '$DOMAIN/$USER_NEW/'
where login = '$USER@$DOMAIN';

insert into aliases(alias,rcpt)
values('$USER@$DOMAIN','$USER_NEW@$DOMAIN');

update aliases set
rcpt = '$USER_NEW@$DOMAIN'
where rcpt = '$USER@$DOMAIN';

END

mv $MAILDIR/$DOMAIN/$USER $MAILDIR/$DOMAIN/$USER_NEW

или ещё один скриптик, олицетворяющий вопиющий случай деревенской наколеночной автоматизации:

#!/bin/sh

TMP=/var/tmp/name
NAME=$1

echo $1 > $TMP
sed -f - $TMP > $TMP.1 <<END
s/ъа/ia/g
s/ъе/ie/g
s/ъё/ie/g
s/ъи/ii/g
s/ъй/ij/g
s/ъо/io/g
s/ъу/iu/g
s/ъы/iy/g
s/ъэ/ie/g
s/ъю/iyu/g
s/ъя/iya/g

s/ияА/iaA/g
s/ияБ/iaB/g
s/ияВ/iaV/g
s/ияГ/iaG/g
s/ияД/iaD/g
s/ияЕ/iaE/g
s/ияЁ/iaE/g
s/ияЖ/iaZ/g
s/ияЗ/iaZ/g
s/ияИ/iaI/g
s/ияЙ/iaJ/g
s/ияК/iaK/g
s/ияЛ/iaL/g
s/ияМ/iaM/g
s/ияН/iaN/g
s/ияО/iaO/g
s/ияП/iaP/g
s/ияР/iaR/g
s/ияС/iaS/g
s/ияТ/iaT/g
s/ияУ/iaY/g
s/ияФ/iaF/g
s/ияХ/iaH/g
s/ияЦ/iaT/g
s/ияЧ/iaC/g
s/ияШ/iaS/g
s/ияЩ/iaS/g
s/ияЫ/iaY/g
s/ияЭ/iaE/g
s/ияЮ/iaY/g
s/ияЯ/iaY/g

s/ия/ya/g
s/ий/y/g
s/ыя/y/g
s/ая/aya/g
s/яя/aya/g
s/ья/ya/g
s/ьи/ii/g
s/ью/ju/g
s/ье/ie/g
s/ьё/ie/g
s/ие/ie/g

s/а/a/g
s/А/A/g
s/б/b/g
s/Б/B/g
s/в/v/g
s/В/V/g
s/г/g/g
s/Г/G/g
s/д/d/g
s/Д/D/g
s/е/e/g
s/Е/E/g
s/ё/e/g
s/Ё/E/g
s/ж/zh/g
s/Ж/Zh/g
s/з/z/g
s/З/Z/g
s/и/i/g
s/И/I/g
s/й/j/g
s/Й/J/g
s/к/k/g
s/К/K/g
s/л/l/g
s/Л/L/g
s/м/m/g
s/М/M/g
s/н/n/g
s/Н/N/g
s/о/o/g
s/О/O/g
s/п/p/g
s/П/P/g
s/р/r/g
s/Р/R/g
s/с/s/g
s/С/S/g
s/т/t/g
s/Т/T/g
s/у/u/g
s/У/U/g
s/ф/f/g
s/Ф/F/g
s/х/kh/g
s/Х/Kh/g
s/ц/ts/g
s/Ц/Ts/g
s/ч/ch/g
s/Ч/Ch/g
s/ш/sh/g
s/Ш/Sh/g
s/щ/sch/g
s/Щ/Sch/g
s/ы/y/g
s/Ы/Y/g
s/э/e/g
s/Э/E/g
s/ю/yu/g
s/Ю/Yu/g
s/я/ya/g
s/Я/Ya/g

s/ь//g
s/ъ//g
END
cat $TMP.1
rm -f $TMP $TMP.1

Этот скрипт транскрибирует имя пользователя из русского написания в латинское, в соответствии с корпоративными правилами.

Вот примеры его работы:

$ ./standart_name.sh СтупинВА
StupinVA
$ ./standart_name.sh ЧернышковДЮ
ChernyshkovDYu

Есть правда ещё требования к длине логина и к буквам-инициалам, но скрипт делает 98% самой нудной работы, на которой легко ошибиться.

P.S. Совсем недавно я ещё писал о том, как можно сохранить одним скриптом все настройки сервера: Резервная копия настроек сервера

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

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