Относительно недавно переехал на GNU/Linux. Преобразовывая плей-листы от foobar2000 в .m3u, заметил, что бывают еще .m3u8. Оказывается, это тот же .m3u, но в кодировке UTF-8. Непорядок, подумал я, и решил привести всё в кошерный вид, т.е. перевести списки .m3u в .m3u8, т.к. все файлы храню в UTF-8. Этих самых плей-листов у меня довольно много (более 100), пэтому решил написать скрипт на баше.
Поскольку музыка была скопирована с NTFS раздела на раздел ext4 – кодировка всех файлов (плей-листов) была CP1251, а права всех файлов включали в себя бит «исполняемый» – это я тоже решил пофиксить.
Итак, что делает написанный скрипт:
Реализован «тихий» и подробный режимы выполнения, предусмотрено аккуратное преобразование списков (старые будут удалены, только если преобразование пройдёт успешно); выявлен и пофикшен баг кривого именования русских файлов (мой Debian Squeeze в качестве sh использует dash, он и тупил – bash точно правильно отрабатывает).
Представленный ниже листинг скрипта нужно сохранить как «m3migr», и сделать его исполняемым («chmod +x m3migr»). Запуск — "./m3migr <каталог_с_музыкой>" — тихий режим, или "./m3migr -v <каталог_с_музыкой>" — выведет все действия в консоль.
Полученные после преобразования плей-листы протестированы на Amarok 2.3.0 – всё работает.
Собственно, сам скрипт:
1. Нейл Мэтью, Ричард Стоунс. Основы программирования в Linux, 4-е издание. Глава 2
2. Конспект по Bash на LOR
3. Habrahabr. Основы Bash, часть 1
4. Habrahabr. Основы Bash, часть 2
Поскольку музыка была скопирована с NTFS раздела на раздел ext4 – кодировка всех файлов (плей-листов) была CP1251, а права всех файлов включали в себя бит «исполняемый» – это я тоже решил пофиксить.
Итак, что делает написанный скрипт:
- устанавливает стандартные права на файлы
- устанавливает стандартные права на папки
- преобразовывает все плейлисты из .m3u в .m3u8
Реализован «тихий» и подробный режимы выполнения, предусмотрено аккуратное преобразование списков (старые будут удалены, только если преобразование пройдёт успешно); выявлен и пофикшен баг кривого именования русских файлов (мой Debian Squeeze в качестве sh использует dash, он и тупил – bash точно правильно отрабатывает).
Представленный ниже листинг скрипта нужно сохранить как «m3migr», и сделать его исполняемым («chmod +x m3migr»). Запуск — "./m3migr <каталог_с_музыкой>" — тихий режим, или "./m3migr -v <каталог_с_музыкой>" — выведет все действия в консоль.
Полученные после преобразования плей-листы протестированы на Amarok 2.3.0 – всё работает.
Собственно, сам скрипт:
#!/bin/bash
# NOTE: не использовать /bin/sh - портит русские имена файлов
# Скрипт автоматической миграции музыкальных файлов из Windows
# Преобразовывает .m3u в .m3u8 и устанавливает стандартные
# права на все файлы
# --------------------------------- ФУНКЦИИ ------------------------------------
# Функция преобразования m3u плейлиста в m3u8 (UTF-8)
convert_m3u() {
old_filename="$1" # .m3u
new_filename="${1}8" # .m3u8
if [ "$is_verbose" = "true" ]; then
printf "convert \"${old_filename}\" to \"${new_filename}\"\\n"
fi
iconv -f CP1251 -t UTF-8 "$old_filename" > "$new_filename"
ls_tmp=$(ls -s "$new_filename")
new_file_size=${ls_tmp%% *}
if [ -f "$new_filename" ] && [ -n "$new_file_size" ] && [ "$new_file_size" -gt 0 ]; then
rm -f "$old_filename"
rm -f "${old_filename}~"
rm -f "${new_filename}~"
fi
}
# Функция установки прав для файлов
chmod_file() {
if [ -f "$1" ]; then # для файлов
if [ "$is_verbose" = "true" ]; then
printf "change mode for file \"${1}\"\\n"
fi
chmod 644 "$1" # - rw- r-- r--
fi
}
# Функция установки прав для директорий
chmod_dir() {
if [ -d "$1" ]; then # для директорий
if [ "$is_verbose" = "true" ]; then
printf "change mode for dir \"${1}\"\\n"
fi
chmod 755 "$1" # d rwx- r-x r-x
fi
}
# ---------------------------- ТЕЛО ПРОГРАММЫ ----------------------------------
is_verbose="false"
# Проверка переданных аргументов
if [ "$1" = "-v" ] || [ "$1" = "--verbose" ]; then
is_verbose="true"
shift
fi
if [ -d "$1" ]; then
music_dir="$1"
else
printf "usage: m3migr [{-v | --verbose}] music_dir\\n"
exit 1
fi
printf "Запуск приложения...\\n"
sleep 1
printf "Изменение прав для файлов...\\n"
cur_file=""
find "$1" -name "*" -type f -print | while read cur_file
do
chmod_file "$cur_file"
done
sleep 1
printf "Изменение прав для директорий...\\n"
cur_dir=""
find "$1" -name "*" -type d -print | while read cur_dir
do
chmod_dir "$cur_dir"
done
sleep 1
printf "Преобразование всех m3u плейлистов в m3u8...\\n"
cur_file=""
find "$1" -name "*.m3u" -type f -print | while read cur_file
do
convert_m3u "$cur_file"
done
printf "\\nOK!\\n"
exit 0
Список использованной литературы
1. Нейл Мэтью, Ричард Стоунс. Основы программирования в Linux, 4-е издание. Глава 2
2. Конспект по Bash на LOR
3. Habrahabr. Основы Bash, часть 1
4. Habrahabr. Основы Bash, часть 2