Консольные хитрости
Опытные юниксоиды знают и осознают всю мощь использования командной строки и немного “свысока” посматривают на “мышевозов” :) Но и в консоли есть свои недостатки, которые побеждаются с помощью каких-то приемов. У каждого свой набор, а я хочу поделиться своими наработками-находками-привычками, которые появились за долгие годы использования командной строки. Эдакий небольшой cheat-sheet.
Начнем :)
1. Копирование файлов с указанием прогресса. Всегда чертовски не хватало информативности в cp
rsync --progress file1 file2
2. Преобразование текста в картинку. Использовал для создания простенькой капчи
echo -e "Some Text Line1\nSome Text Line 2" | convert -background none -density 196 -resample 72 -unsharp 0x.5 -font "Courier" text:- -trim +repage -bordercolor white -border 3 text.gif
3. Поиск и замена в текстовых файлах
find . -iname "FILENAME" -exec sed -i 's/SEARCH_STRING/REPLACE_STRING/g' {} \;
4. Метод Столлмана! Отправка веб-странички по почте :)
{ u="http://twitter.com/boombick"; echo "Subject: $u"; echo "Mime-Version: 1.0"; echo -e "Content-Type: text/html; charset=utf-8\n\n"; curl $u ; } | sendmail recipient@example.com
5. Запись iso-файла на диск
cdrecord -v speed=4 driveropts=burnfree dev=/dev/scd0 cd.iso
6. Ограничение канала для scp. В данном случае ограничен 10kbps
scp -l10 boombick@srv02:/home/svnstat/* .
7. Скриншот на удаленной машине :) (С запущенными иксами конечно)
DISPLAY=":0.0" import -window root screenshot.png
8. Качаем и сразу распаковываем :)
wget -qO - http://example.com/path/to/blah.tar.gz | tar xzf -
9. url_encode :) Достаточно примитивно, но часто помогает
echo "$url" | sed 's/%/%25/g;s/ /%20/g;s/!/%21/g;s/"/%22/g;s/#/%23/g;s/\$/%24/g;s/\&/%26/g;s/'\''/%27/g;s/(/%28/g;s/)/%29/g'
10. Погода в Москве :) Подставьте свой город
curl -s "http://www.google.com/ig/api?weather=Moscow" | sed 's|.*<temp_c data="\([^"]*\)"/>.*|\1|'
Пока все, to be continued
Первым — ну просто убил наповал! Позавчера синкал два диска на 1.7T, жалел, что нет такого. В общем, покраснел и ушёл читать man-ы. :-)
При копировании дисков, всё же через dd наверное быстрее будет. А у dd можно посмотреть его прогресс, если увести его в бэкграунд и посылать ему сигнал USR1. К примеру как написано тут:
http://linuxcommando.blogspot.com/2008/06/show-progress-during-dd-copy.html
В 8-м лучше tar xf или tar xvf.
Ты бы длинные команды разбил обратными слешами на строки. А то со скроллами нечитабельно.
Кстати, tar без ключа f и так читает из stdin ;-)
bonus: Отправлять файлы по почте удобно через mutt:
echo “Body” | mutt -s “subject” -a file.name — some@body.domain
вместо пятого лучше пользоваться dvdbackup
вместо изо будет нормальная файловая структура
Интересно.
Добавил по cron’у запуск notify-send с результатом команды – можно и в conky :
wget -q –header=’Accept-Language: ru’ “http://www.google.com/ig/api?weather=Moscow” -O – | sed “s|/>|\n|g”|egrep “<(temp_c data|condition data|day_of_week data|low data|high data)=” | iconv -f cp1251 -t utf8 |tr -d \”|while IFS=”=” read A B;do echo “$A” | grep -q “forecast_conditions” && echo; echo -ne ” \t$B”;done
Сплошная облачность -3
Вс -3 0 Местами солнечно
Пн 1 3 Местами солнечно
Вт -1 4 Снегопад
Ср -7 1 Местами солнечно
2anonimous
спасибо, круто! :)
благодарю , мне как новичку очень интересно потестить ваши примеры, но вот на втором что-то я забуксовал, мне вот так отвечают:
convert: option requires an argument `-background’ @ convert.c/ConvertImageCommand/691.
чтобы это значило, не подскажите ?
ops все исправил, извините за пост выше )
Спасибо, кое что возьму себе на вооружение.
А по поводу прогресс-баров, вы не юзал отдельные утилиты для этих целей? Что-то типа http://www.theiling.de/projects/bar.html
2adw0rd
Спасибо, любопытно :)
Согласен с Flycat… Сижу красный как рак… Стыдно…Ну еще бы – не додуматься до такой простой вещи! Хотя может я это знал да забыл))
По поводу первого:
use pv, Luk!
2adw0rd
Когда-то шляясь по вэбу нашел интересный вариант прогрессбара на чистом шелле. К сожалению не помню уже источник…
#!/bin/sh
# usage: progress
#PB_NOPERC=1 # если определена, не выводятся проценты
#PB_NOITEM=1 # если определена, не выводится текущее_положение/максимум
progress()
{
local width=50
local max=$1 curr=$2 pos=$width perc=100
if [ $curr -lt $max ]; then
pos=$((curr*width/max))
perc=$((curr*100/max))
fi
local str=”\r[$(printf "%${pos}s" \
| sed 's/ /#/g')$(printf "%$((width-$pos))s" \
| sed 's/ /-/g')]”
[ -z "$PB_NOPERC" ] && str=”$str $perc%”
[ -z "$PB_NOITEM" ] && str=”$str ($curr/$max)”
echo -ne $str 1>&2
[ $perc -eq 100 ] && echo
}
Для себя реализовал на нем простейший скрипт для бэкапа некоторых директорий (дописать после progress() ):
title()
{
LEN=`echo $1 | wc -c`
[ $(($LEN%2)) -eq 0 ] && ((LEN++))
POS=$(( (25-$LEN)/2 + $LEN ))
printf “+++++[%${POS}s" $1
printf "%$(($POS-$LEN))s]+++++\n” ” ”
}
NOW=`date +%Y.%m.%d_%H.%M.%S`; echo -ne “33[1;34m"; echo ; echo +--------------------------------------+; echo "| Create backup: $NOW |"; echo +--------------------------------------+; echo -ne "33[m"; ls -l | grep '^d' | grep -v '\-=backup=-' | sed 's/^.* \([^ ]\+\)$/\1/’ | while read i; do echo ; title $i; ALL=`find $i | wc -l`; MAXCOUNT=$((ALL/100)); if [ $MAXCOUNT -eq 0 ]; then MAXCOUNT=1; fi; mkdir -p — -=backup=-/$NOW; ( cd — -=backup=-/$NOW; title $i >>-=log=-; tar -cvjf $i.tar.bz2 ../../$i 2>>-=log=- | while read j; do COUNT=$((COUNT+1)); if [ $(($COUNT%$MAXCOUNT)) - eq 0 ] || [ $ALL -eq $COUNT ]; then progress $ALL $COUNT; fi; done ); done
Когда-то, ради прикола накатал его в одну строчку, теперь разбираться не охота, как он работает. Но в двух словах — подсчитывается общее кол-во файлов и поддиректорий и по мере вывода имен пакуемых файлов tar’ом, декрементируется и передается progress’у.
PS: Я это к тому, что в UNIX’е можно обойтись и более простыми средствами, не обязательно под каждый чих выкачивать и собирать что-то бинарное… :-)
Пример работы:
bash-3.1$ ./backup.sh
+————————————–+
| Create backup: 2010.03.09_18.44.02 |
+————————————–+
+++++[ ACE_TAO ]+++++
[##################################################] 100% (14/14)
+++++[ COBRA ]+++++
[######--------------------------------------------] 13% (6/46)
^C
bash-3.1$
Черт, дополнительный ввывод промежуточных данных замедляет процесс, и при определенных условиях очень сильно, поэтому только dd при больших объемах, пока копирует покурить, а если уже не лезет killall -USR1 dd, может и на кофе времени хватит.
Damon, ого, фундаментально! :)
Я готовлю очередной пост примерно на эту же тематику, вы позволите использовать ваши наработки?
boombick, без вопросов.
progress(), все равно не моя ф-ция, а остальное тривиально, вобщем-то. :-)