|
Памятка с полезными скриптами и наборами опцийЗдесь собрана коллекция скриптов и приёмов. Большинство из них заточено под мои собственные нужды, но модифицировать их не сложно. Обратите внимание, тут Linux смешан с FreeBSD. Я работаю над этим :-) Подготовка видео H.264 320x240 Конвертируем видео и пишем его на video-DVD: Преобразование одного большого FLAC во много mp3 Добавление ID3-тегов в mp3-файлы Найти файлы и заархивировать их Настройка цветов в команде ls во FreeBSD Печатаем брошюру с двух сторон Преобразование видеоПодготовка видео H.264 320x240Проверено на Sony Walkman NWZ-A726, Nokia N78, Samsung S3550. mencoder -ofps 25 -of lavf -lavfopts \ format=mp4 \ -af lavcresample=48000 -srate 48000 -vf-add harddup \ -vf-add scale=320:240 -oac lavc -ovc lavc -lavcopts \ aglobal=1:vglobal=1:acodec=libfaac:abitrate=128:vcodec=mpeg4:\ vbitrate=250:autoaspect:mbd=2:mv0:trell:v4mv:cbp:last_pred=3:\ predia=2:dia=2:precmp=2:cmp=2:subcmp=2:preme=2:turbo \ -quiet -info name="Name_to_display" \ -o output.mp4 input.avi Для тех же целей можно воспользоваться экспериментальными фичами ffmpeg. ffmpeg -i input.avi -f mp4 -vcodec mpeg4 -b:v 250k \ -s 320x180 -acodec aac -ar 48000 -ab 64k -ac 2 \ -strict experimental \ output.mp4 Конвертируем видео и пишем его на video-DVD:ffmpeg -i detskij.albom.avi -target dvd -aspect 16:9 -sameq video.mpg # или более продвинутый вариант что-то вроде этого # ffmpeg -i aleksandr.nevskij.avi -target ntsc-dvd -acodec mp2 -b 5000k -ab 192k -aspect 16:9 video2-b5M-ab-192k.mpg mkdir DVD dvdauthor --title -f video.mpg -o DVD VIDEO_FORMAT=PAL dvdauthor -T -o DVD mplayer dvd://1 -dvd-device ./DVD growisofs -dvd-compat -dvd-video -speed=4 -Z /dev/dvd ./DVD Если звук тихийто применяем фильтр -af lavcresample=48000,volnorm=2:1 Dump DVD:mplayer -dumpstream -dumpfile rip.mpg dvd://1 Разрезать роликна две части тоже так mencoder -ovc copy -oac copy -endpos 0:50:00 -o part1.avi video.avi mencoder -ovc copy -oac copy -ss 0:50:00 -o part2.avi video.avi На много небольших частей, можно примерно так #!/bin/sh for i in 00:00 00:20 00:40 01:00 01:20 01:40 do p=`echo $i | sed 's/:/_/g'` n="kolobaha_part_$p.avi" echo $n mencoder -ovc copy -oac copy -ss $i:00 -endpos 0:20:00 -o $n Kolobaha.avi done (доработать напильником по-вкусу) Разделить/слить видео/аудио## отделяем видео mencoder -ni -ovc copy -nosound -ofps 25 -o video.wmv 'American Psycho.mkv' ## отделяем аудио mplayer -ni -ao pcm:file=audio.wav -vc dummy -vo null 'American Psycho.mkv' ## соединяем всё снова mencoder -idx -audiofile audio.wav -ovc lavc -lavcopts vcodec=mpeg4 \ -ofps 25 -oac mp3lame -lameopts vbr=3 video.wmv -o 'American Psycho.avi' Работа с аудиоПреобразование одного большого FLAC во много mp3flac -dc ../*.flac | lame -h -b 256 /dev/stdin foo.mp3 mp3splt -c ../*.flac.cue foo.mp3 Добавление ID3-тегов в mp3-файлыПредполагается, что файл раскиданы по директория Исполнитель/Альбом/Песня. Некоторым файлам и директориям добавлен цифровой префикс NN-, который необходимо удалить в тегах. for a in * # исполнители
do
if test -d "$a"
then
cd "$a"
for s in * # альбомы
do
if test -d "$s"
then
cd "$s"
i=1
c=`ls -1 *.mp3 | wc -l`
for f in *.mp3 # песни
do
ff=${f%.mp3}
id3tag -a "$a" \
-A "$a ${s#[0-9][0-9]-}" \
-s "${ff#[0-9][0-9]-}" \
-c "no coments" \
-C "no descr" \
-y 2009 -t $i -T $c -g 1 -w -n "$f"
i=$(($i+1))
done
cd ..
fi
done
cd ..
fi
done
Работа с архивамиСкрипт для архивированияДаёт архиву имя с датой, пытается добавить префикс, если файл с таким именем уже существует. #!/bin/sh
clr0=`echo -e '\e[0m'`
clr1=`echo -e '\e[32m'`
clr2=`echo -e '\e[33m'`
clr3=`echo -e '\e[1m\e[31m'`
d=`date '+-%y-%m-%d'`
for arg in "$@"
do
base=`basename "$arg"`
dir=`dirname $arg`
ok='not'
for i in 0 1 2 3 4 5 6 7 8 9
do
if test "a$i" = "a0"
then
suff=''
else
suff="-$i"
fi
aname="$base$d$suff.tgz"
if test -e "$aname"
then
echo "$clr2[INFO]$clr0 Left name \"$aname\""
else
tar -c -C "$dir" -z -f "$aname" "$base"
if test "a$?" = 'a0'
then
echo "$clr1[OK]$clr0 $arg -> $aname"
else
echo "$clr3[ERROR]$clr0 Tar error for \"$arg\""
fi
ok='ok'
break
fi
done
if test "a$ok" = "anot"
then
echo "$clr3[ERROR]$clr0 Can not create name of archive for \"$arg\"!"
fi
done
Найти файлы и заархивировать ихfind . -type f -size -1000 | tar czv -T- -f file.tgz Перекодировка имён файловПример перекодирования CP866 в транслит всех файлов и директорий в дереве. #!/bin/sh
MAGIC='XXXX'
if test "a$1" = "a$MAGIC"
then
# pipe mode
# iconv -f UTF-8 -t koi8-r
iconv -f CP866 -t koi8-r |
perl -pe "
chomp;
y/абвгдеёзийклмнопрстуфхъыьэ/abvgdeezijklmnoprstufh'y'e/;
y/АБВГДЕЁЗИЙКЛМНОПРСТУФХЪЫЬЭ/ABVGDEEZIJKLMNOPRSTUFH'Y'E/;
s/ж/zh/g;
s/ц/ts/g;
s/ч/ch/g;
s/ш/sh/g;
s/щ/sch/g;
s/ю/ju/g;
s/я/ja/g;
s/Ж/Zh/g;
s/Ц/Ts/g;
s/Ч/Ch/g;
s/Щ/Sch/g;
s/Ю/Ju/g;
s/Я/Ja/g;
s/\s+/_/g;
s/[\177-\377]+/-/g;
"
else
# find mode
find -d . | while read s
do
p="${s%/*}"
f="${s##*/}"
if test "a$f" = "a$d"
then
:
else
ef=`echo $f | "$0" "$MAGIC"`
if test "a$f" = "a$ef"
then
:
else
mv "$p/$f" "$p/$ef"
fi
fi
done
fi
Генерация паролейОчень удобный способ генерации паролей: openssl rand -base64 24 Генерация md5-суммыДля генерации md5-сумм существуют отдельные утилиты (под FreeBSD — md5, под Linux — md5sum), но выдают информацию в разных форматах. openssl — более универсальный метод: openssl md5 файл ШифрованиеЗашифровать файл: openssl enc -aes-256-cbc -salt -in входной_файл -out зашифрованный_файл Расшифровать: openssl enc -d -aes-256-cbc -in зашифрованный_файл -out расшифрованный_файл Того же самого эффекта можно доиться, управляя стандартными потоками: # шифруем openssl enc -aes-256-cbc -salt < входной_файл > зашифрованный_файл # расшифровываем openssl enc -d -aes-256-cbc < зашифрованный_файл > расшифрованный_файл Полезный пример: # создаём защищённый паролем tar-архив tar czf - your_dir | openssl enc -aes-256-cbc -salt >file.tgz # распаковываем этот архив openssl enc -d -aes-256-cbc < file.tgz | tar xzf - Telnet через opensslПример работы с gmail.com по SSL по POP3: $ openssl s_client -crlf -ign_eof -connect pop.gmail.com:995 CONNECTED(00000003) .... +OK Gpop ready for requests from XXX.XXX.XXX.XXX XXXXXXXXXXXXXXXX USER XXXXXXXX +OK send PASS PASS XXXXXXXX +OK Welcome. STAT +OK 528 44954440 LIST +OK 528 messages (44954440 bytes) 1 2867 .... 527 1020 528 2583 . TOP 5 0 +OK message follows .... . QUIT +OK Farewell. read:errno=0 КонсольНастройка цветов в команде ls во FreeBSDКоманда ls во FreeBSD работает с цветами, не как в Linux. Подробно об этом можно прочитать в man 1 ls, а здесь я приведу скриптик для очень простой настройки любой раскраски. Предлагаю разместить в .profile, или другом инициализационном скрипте, примерно следующие инструкции: # эти переменные изменять не надо black='a' red='b' green='c' brown='d' blue='e' magenta='f' cyan='g' light_grey='h' bold_black='A' bold_red='B' bold_green='C' yellow='D' bold_blue='E' bold_magenta='F' bold_cyan='G' bold_light_grey='H' default='x' # ---------------------------------------------------- # а вот тут вы можете установить любые цвета для # разных элементов файловой системы (см. комментарии), # используя имена переменных, инициализированных выше; # для каждого элемента указывается два цвета: # цвет букв и цвет фона # xx00="$bold_blue$default" # directory xx01="$cyan$default" # symbolic link xx02="$magenta$default" # socket xx03="$magenta$default" # pipe xx04="$green$default" # executable xx05="$yellow$default" # block special xx06="$brown$default" # character special xx07="$bold_green$green" # executable with setuid bit set xx08="$bold_green$default" # executable with setgid bit set xx09="$bold_blue$blue" # directory writable to others, with sticky bit xx10="$bold_blue$blue" # directory writable to others, without sticky bit # # ---------------------------------------------------- # экспортируем необходимые переменные LSCOLORS="$xx00$xx01$xx02$xx03$xx04$xx05$xx06$xx07$xx08$xx09$xx10" export LSCOLORS CLICOLOR="YES" export CLICOLOR Вы можете установить любые цвета; сейчас выбраны цвета, в духе Linux-традиции, правда с небольшими моими дополнениями. Приведение bash в чувстваБывает, что перестают работать консоли, выдаётся сообщение вида: subshell.c: read (subshell_pty...): No such file or directory Решается проблема просто: killall -CONT bash Создание patch'ейСоздать patch: diff старый_файл новый_файл > patch_файл Наложить patch: patch старый_файл patch_файл Естественно порядок файлов везде важен. FreeBSD/Linux md5/md5sumВо FreeBSD и в Linux есть две утилиты для подсчёта md5-сумм файлов. Они выдают один а тот же результат, но в несколько разном формате, что очень неудобно, если надо сравнить файлы (по суммам), лежащие на Linux и FreeBSD машинах. Поэтому для каждой системы я написал маленький скрипт, эмитирующий поведение недостающей утилиты. Для FreeBSD — md5sum: !/bin/sh md5 -- "$@" | sed -E 's/^MD5 \((.*)\) = ([^[:space:]]+)/\2 \1/' Для Linux — md5: #!/bin/sh md5sum -- "$@" | sed -r 's/^(\S+)\s+(\S+)/MD5 (\2) = \1/' Они, конечно, не позволяют использовать ключи командной строки, но обычно это как раз то, что нужно. Информационные утилитыЯдроПосмотреть настройки ядра: sysctl -ah. Посмотреть, что значат все эти переменные: sysctl -ad. Посмотреть сообщения ядра: dmesg Посмотреть окружение ядра (hint'ы): kenv Информация о ядре и загруженных модулях: kldstat и kldstat -v. Нагрузка на дискиПод Linux SMART можно посмотреть /usr/sbin/skdump /dev/sda Посмотреть активность ввода/вывода можно командой iotop Под FreeBSD очень полезная утилита smartctl /usr/local/sbin/smartctl -a /dev/ad4 выдаст полную информацию по указанному диску, вот лишь, некоторые поля: ID# ATTRIBUTE_NAME FLAG VALUE WORST THRESH TYPE UPDATED WHEN_FAILED RAW_VALUE 1 Raw_Read_Error_Rate 0x000f 100 100 051 Pre-fail Always - 0 3 Spin_Up_Time 0x0007 253 253 025 Pre-fail Always - 5760 4 Start_Stop_Count 0x0032 100 100 000 Old_age Always - 77 7 Seek_Error_Rate 0x000f 253 253 051 Pre-fail Always - 0 8 Seek_Time_Performance 0x0025 253 253 015 Pre-fail Offline - 0 9 Power_On_Hours 0x0032 100 100 000 Old_age Always - 5899 10 Spin_Retry_Count 0x0033 253 253 051 Pre-fail Always - 0 12 Power_Cycle_Count 0x0032 100 100 000 Old_age Always - 61 194 Temperature_Celsius 0x0022 050 043 000 Old_age Always - 50 196 Reallocated_Event_Count 0x0032 253 253 000 Old_age Always - 0 199 UDMA_CRC_Error_Count 0x003e 200 200 000 Old_age Always - 0 200 Multi_Zone_Error_Rate 0x000a 100 100 000 Old_age Always - 0 201 Soft_Read_Error_Rate 0x000a 100 100 000 Old_age Always - 0 202 TA_Increase_Count 0x0032 253 253 000 Old_age Always - 0 На самом деле информации выдаётся на много больше. Информация о нагрузке на диски в реальном масштабе времени: gstat и iostat -w 1. Информация о swap'e: swapctl -lh Информация о всех открытых файлах fstat. Есть ещё systat. Разное, но полезноеОчень полезная утилита lsof выдаёт список всех открытых файлов, включая сокеты, конвейеры и прочее. Она на удивление неприхотлива, и ей не требуется ни специальных возможностей ядра, ни монтирования procfs. Почему-то она не входит в минимальную установку FreeBSD. Посмотреть, от каких библиотек зависит исполняемый файл: ldd -f '%p\n' -a /usr/local/bin/mc | sort | uniq Список локалей: locale -a. Очень полезен мониторчик mbmon и его X-версия xmbmon. Он показывает температуры и вольтажи на системной плате. ПечатьПечатаем брошюру с двух сторонНа понадобится PostScript-принтер и два скрипта. Вспомогательный скрипт на перле: #!/usr/bin/perl
# mkbook-duplex.pl
$tumble = 'false';
$cookie = «"END_OF_COOKIE";
%%BeginFeature: *Duplex DuplexTumble
mark
{
(«) cvx exec /Duplex (true) cvx exec /Tumble ($tumble) cvx exec (») cvx exec
systemdict /setpagedevice get exec
} stopped
cleartomark
%%EndFeature
END_OF_COOKIE
$ps = '';
while (<>) {
$ps .= $_;
}
$nsubs = ($ps =~ s/(?:\n|\r)(%%EndSetup)/\n$cookie$1/);
unless ($nsubs) {
$nsubs = ($ps =~ s/(?:\n|\r)(%%EndProlog)(?:\n|\r)/\n$1\n$cookie/);
}
unless ($nsubs) {
$nsubs = ($ps =~ s/(?:\n|\r)(%%Page:\s)/\n$cookie$1/);
}
unless ($nsubs) {
die "ERROR";
}
print $ps;
Скрипт на шеле: #!/bin/sh # mkbook cat "$1" | psbook | psnup -2 | pstops "2:0U(8.5in,11.7in),1(0in,0in)" | mkbook-duplex.pl > "$1-booklet.ps" #pstops "2:0U(8.5in,11.7in),1" #pstops "2:0U(8.5in,11.7in),1(-.025in,0in)" | Теперь преобразуем исходные файл и печатаем его: $ mkbook text.ps $ lpr text.ps-booklet.ps Вы можете связаться со мной по e-mail a.michurin@gmail.com.
|