Видео смотреть бесплатно

Смотреть красивый видео

Официальный сайт graffitistudio 24/7/365

Смотреть видео бесплатно

15.06.10 21:42 dr_magnus

Скрипты на bashПерекодирование аудиокниг. Часть 2

В дополнение к первой части дополнил скрипт. Теперь не нужно конкретно указывать директорию, в которой находятся файлы для перекодировки. Достаточно просто указать директорию, в которой лежит коллекция аудиокниг, и скрипт сам определит, что нужно кодировать.
Т.к. сам не знаток bash'a, то прошу знатоков ткнуть носом в ошибки и возможности оптимизации скрипта.

UPD: Спасибо lava за mktemp - подправил скрипт немного.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#!/bin/sh
# указание директории с коллекцией
dir_name="${1}"
# переход в эту директорию - избавляет от проблемы с пробелами в именах папок
cd "${dir_name}"

# создание временной папки
tmp_dir="$(mktemp -d -p "$dir_name")"

# поиск mp3-файлов
find -iname '*.mp3' | while read input_file; do
# отделение имени папки от имени файла
base_dir="$(dirname "$input_file")"
# отделение имени файла от имени папки
base_file="$(basename "$input_file")"
# получение битрейта
bitrate=$(mp3info -r m -p "%r\n" "$input_file")
# кодирование
if [ "$bitrate" -gt 96 ]; then
#   echo "$base_dir"
    title=$(mid3v2 -l "$input_file" | sed -n 's/^TIT2=//p')
    artist=$(mid3v2 -l "$input_file" | sed -n 's/^TPE1=//p')
    album=$(mid3v2 -l "$input_file" | sed -n 's/^TALB=//p')
    lame -b 96 --cbr -h --tt "$title" --ta "$artist" --tl "$album" "$input_file" "$tmp_dir/$base_file"
# удаление исходного файла
    rm "$input_file"
# возвращение на его место перекодированного файла
    mv "$tmp_dir/$base_file" "$base_dir"
fi
done

# удаление временной папки
rm "$tmp_dir"

Буду благодарен за отзывы и советы.



NickNill 15.06.10 22:00 # +0
эх, мне еще многому надо научится =) не знал команд basename и dirname. столько sed'ов понаписывал =)))
uscr 15.06.10 22:11 # +0
ABSG при своевременном прочтении экономит время и нервы.
lava 15.06.10 22:33 # +3
Кстати, кроме dirname/basename есть прикол следующего вида:
1
2
3
4
5
6
7
8
9
┌─(~)
└hawk→ export file=/a/b/c/d
┌─(~)
└hawk→ echo ${file##*/}
d
┌─(~)
└hawk→ echo ${file%/*}
/a/b/c
 


Правда, толково работает, если точно нету слэша в конце =)

Зато как быстро:
1
2
3
4
5
6
7
8
9
10
11
12
13
┌─(~)
└hawk→ time for a in `seq 1 10000`; do dirname $file >/dev/null; done

real    0m8.591s
user    0m0.043s
sys     0m1.943s
┌─(~)
└hawk→ time for a in `seq 1 10000`; do echo ${file##*/} >/dev/null; done

real    0m0.303s
user    0m0.267s
sys     0m0.033s
 
dr_magnus 15.06.10 22:46 # +0
прикольно.. только нифига не понятно.. :-(
┌─(~)
└hawk→ time for a in `seq 1 10000`; do echo ${file##*/} >/dev/null; done

это скрипт? как его использовать? можно парочку примеров с комментариями? а можно применительно к моему случаю?
сорри за дилетантство.
lava 16.06.10 00:35 # +3
time измеряет время выполнения команды
seq выводит последовательность n1 n1+1 n1+2 ... n2
for a in ; do ; done - цикл for, в котором a пройдёт по значениям массива и каждый раз будет выполнена
echo выводит на экран , при этом подставляя специальные переменные
${var} = $var
${var##<маска>} - значение var, но отфильтрованное в соответствии со специфичными правилами.

Таким образом, мы меряем время, в течение которого выполнится цикл для 10000 элементов, который просто выводит отфильтрованное значение переменной в /dev/null - в никуда.

Можно заметить, что в двух приведённых скриптах в одном случае используется команда dirname, а во втором - фильтрация имени. Разница в скорости составила более, чем в 20 раз простая фильтрация быстрее применеия команды dirname.
dr_magnus 16.06.10 01:01 # +0
спасибо. только боюсь, что для меня это несколько сложновато - слишком давно уже перестал писать, сейчас как будто заново всё учу.
lava 15.06.10 22:14 # +4
Не рекомендовал бы кидать прямо в /tmp/ - а вдруг коллизии с чем-то другим? =)
Лучше всего - создавать временный директорий со случайным названием. Для этой цели рекомендую man mktemp.

А ещё, возможно, стоит создавать этот самый временный директорий прямо внутри сканируемой папки, имхо. Почему? Ответ прост: тогда команда mv точно будет отрабатывать в пределах одного диска, а при использовании /tmp можно столкнуться с избыточным копированием файлов ;)
dr_magnus 15.06.10 22:21 # +0
ок. спасибо. почитаю.
сам об этом задумывался - диски физически разделены.
dr_magnus 16.06.10 01:15 # +0
еще раз спасибо. подправил.
lava 16.06.10 09:02 # +0
1
2
# удаление временной папки
rm "$tmp_dir"


Не отработает. Скажет, что это директорий, а не файл. Надо либо `rmdir`, либо `rm -r`
Daria 16.06.10 05:29 # +0
отлично. добавить нечего. да и коменты сверху просто отличные. сяду наверно пилить свои скрипты для музыки.
raivist 16.06.10 09:27 # +1
Предлагаю:

lame -b 96 --cbr -h --tt "$title" --ta "$artist" --tl "$album" "$input_file" "$tmp_dir/$base_file"
rm "$input_file"
mv "$tmp_dir/$base_file" "$base_dir"

заменить:

lame -b 96 --cbr -h --tt "$title" --ta "$artist" --tl "$album" "$input_file" "$tmp_dir/$base_file" && mv "$tmp_dir/$base_file" "$input_file"
dr_magnus 16.06.10 22:56 # +0
&& mv "$tmp_dir/$base_file" "$input_file"

а это перезапишет исходный файл без подтверждения?
Daria 16.06.10 23:00 # +0
это будет работать только, если lame справится с кодированием. && хорошая вещь.

Лучшие блоги (все 126)
Топ пользователей Топ блогов
Топ пользователей Топ блогов
Элита (все 2307 из 190 городов)
Топ пользователей Топ блогов
В сети: exelens, nvbn, shidoh, le087, karp, enko, dfx

Новенькие: Chupik, GRS, time2die, Anhel, animeshnik
welinux.ru

В хорошем качестве hd видео

Онлайн видео бесплатно


Смотреть русское с разговорами видео

Online video HD

Видео скачать на телефон

Русские фильмы бесплатно

Full HD video online

Смотреть видео онлайн

Смотреть HD видео бесплатно

School смотреть онлайн