2008-11-19

Bash Scripts

Transliteration

cat - | sed "y/абвгдезийклмнопрстуфхцы/abvgdezijklmnoprstufxcy/" | sed "y/АБВГДЕЗИЙКЛМНОПРСТУФХЦЫ/ABVGDEZIJKLMNOPRSTUFXCY/" | \
sed "s/ч/ch/"|sed "s/Ч/CH/"|sed "s/ш/sh/"|sed "s/Ш/SH/"|sed "s/ё/jo/"|sed "s/Ё/JO/"|sed "s/ж/zh/"|sed "s/Ж/ZH/"|sed "s/щ/sh\'/" | \
sed "s/Щ/SH/"|sed "s/э/je/"|sed "s/Э/JE/"|sed "s/ю/ju/" |sed "s/Ю/JU/"|sed "s/я/ja/"|sed "s/Я/JA/" |sed "s/ъ/\`/"|sed "s/ъ/\`/" | \
sed "s/ь/\'/"|sed "s/Ь/\'/"


Конвертим все теги mp3-файлов в текущем каталоге с быдло-cp1251 на ПравоСлавный unicode (необходим mp3unicode!): 
%find . -name "*.mp3" -exec mp3unicode –source-encoding windows-1251 –id3v1-encoding none –id3v2-encoding unicode {} \;
Инструкция по сборке (В конце статьи бинарный пакет...)
Update: mp3unicode - Гавно  (поганит уже UTF8 теги)
find . -name "*.mp3" -exec java -jar ~/Bash_sc/id3iconv-0.2.1.jar {}\;
нужны id3iconv и Java (apt-get install sun-java6-jre) из non-free

Конверт имен файлофф
convmv -r --notest -f cp1251 -t utf8 

Место на диске
Иногда приходится смотреть, кто больше всего занимает место, причём интересуют кандидаты весом в несколько Mb или Gb:
du -hs * | grep "^[0-9,]\+[MG]\+"
du --max-depth=1 $1|sort -n -k 1 |awk '{ printf "%.3f Mb \t%s\n", (0+$1)/1024.0/1024.0, $0 }' -


Погода
lynx --dump http://weather.noaa.gov/weather/current/URWW.html | sed -n "/Temperature/s/[0-9][0-9]\? F (//p; /Humidity/p" | tr -d ")"

Права и разрешения
В текущей директории рекурсивно сменить разрешения на все директории
find ./ -type d -exec chmod 775 {} \;
то же для файлов
find ./ -type f -exec chmod 664 {} \; 
Владелетс
find ./ -exec chown user:group {} \; 

Как снять флаг executable только для файлов в каталоге
find . -type f -exec chmod -x {} \;
Эта команда снимет флажки x со всех файлов в текущем каталоге, но оставит в неприкосновенности каталоги, линки, пайпы и т.п. Вариация данной команды также может быть использована для следующей задачи.

Поиск файлов по содержимому
Используя тот же принцип, мы можем искать файлы не только по имени и типу, но и по содержимому. Пример:
find ~ -exec egrep -i "password" /dev/null {} \;


Echo и sudo
Довольно долго мучался по поводу следующей проблемы. Часто требуется выполнить команду такого рода:
sudo echo "hello world" >> /path/to/file
Т.е. от имени суперпользователя записать что-либо в файл иначе недоступный для записи. На это shell ругнется, сказав о нехватке прав. Это связанно с процессом выполнения данной команды: файл /path/to/file открывается от имени обычного пользователя, тогда как первая часть команды выполняется от рута. При перенаправлении stdout в открытый файл и возникает ошибка.

Ситуацию можно исправить следующим образом:
sudo sh -c 'echo "Hello world" >> /path/to/file'
Однако, есть и более элегантный способ. Для этого понадобится команда tee, читающая stdin и пишущая в stdout или файл:
echo "hello world" | sudo tee -a /path/to/file
Если необходимо перенаправление вида ">" вместо ">>", флажок "-a" не используем:
echo "hello world" | sudo tee /path/to/file
Лично мне эта конструкция экономит много полезных секунд :).

Создание и монтирование образа iso
mount -o loop, unhide -t iso9660 filename.iso /mnt/iso
dd if=/dev/cdrom of=file.iso
mkisofs ~/file.iso /tmp/directory

где file.iso - создаваемый образ, /tmp/directory - каталог с исходными файлами.

Копирование, локальное и не только
Кроме использования стандартной команды "cp" существует оригинальный способ копирования через пайпы (pipes):
cd /
tar -cf - | tar -C -xf -

Команда скопирует каталог в каталог . Этот способ очень полезен при копировании больших объемов данных. При необходимости можно добавить и архивацию ключиком "-z" или "-j":
tar -czf - | tar -C -xzf -
Этот рецепт можно немного дополнить. При необходимости передачи файлов по сети из локальной машины на удаленную можно использовать следующую конструкцию:
cd /
tar czf - | ssh tar xzf - -C 

В результате получился некий аналог scp.


X Forwarding

Полезная и простая фича. Если нужно запустить на удаленной машине что-то, требующее X'ы, добавляем к стандартной команде ssh пару ключиков:
ssh -X -Y 
и спокойно запускаем графические приложения на удаленной машине remote_box.

Поиск дублирующихся файлов fdupes (app-misc/fdupes в gentoo portages) - очень полезно на разного рода файлопомойках...

Проверка работы регулярного выражения
echo "somestring" | egrep "regexp" && echo "true" || echo "false"

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