Относительно недавно переехал на 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