Страница 1 из 1
[РЕШЕНО] Обработка вложенных каталогов
Добавлено: 31 авг 2018, 23:01
mexx400
Здравствуйте. ROSA10/64/Plasma.
В какой программе можно сконвертировать аудиофайлы, чтобы на выходе сохранялась входящая структура каталогов? То есть в каталоге DIR имеются каталоги DIR1, DIR2, DIR3 ... DIR100, в каждом из которых, в свою очередь, имеются вложенные каталоги. Как после конвертации аудиофайлов получить на выходе такую же структуру, но уже с файлами нового формата? Под Windows нашел, а вот в Linux (пробовал Clementene и SoundConverter) на выходе всё валится в одну кучу (может не увидел какую настройку, конечно). Или только скрипт?
Обработка вложенных каталогов
Добавлено: 09 сен 2018, 13:09
PastorDi
Всего одна строчка и все. Например у меня в папке ~/mm и его подпапках лежать .mp3, мне надо все .mp3 во всех вложенных папках конвертануть в .ogg. Всего одна команда:
Код: Выделить всё
find ~/mm -type f -name '*.mp3' -exec bash -c 'ffmpeg -i "$0" -c:a libvorbis -q:a 2 "${0/%mp3/ogg}"' '{}' \;
И у меня в этих же папках и подпапках будут сконвертированные .ogg , а дальше делайте что хотите с ними.
Обработка вложенных каталогов
Добавлено: 09 сен 2018, 15:12
mexx400
PastorDi писал(а): ↑09 сен 2018, 13:09
Всего одна команда:
Спасибо за ответ.
Но это немного не то.
Действительно, все файлы .mp3 конвертируются в файлы .ogg Но .ogg будут лежать в том же каталоге, что и .mp3
А мне надо:
mexx400 писал(а): ↑31 авг 2018, 23:01
после конвертации аудиофайлов получить на выходе такую же структуру, но уже с файлами нового формата
На самом деле задача чисто бытовая - музыку храню преимущественно во .flac Структура каталогов самая простая - жанр/исполнитель/альбом. Но аудио в машине не читает .flac Поэтому дома конвертирую .flac в .mp3 и на флешку. Но когда исполнителей/альбомов более одного, то слушать в машине некую кучу неудобно. Поэтому хочется сохранить структуру каталогов. В Windows у меня плеер JRiver и он предлагает создать соответствующую структуру каталогов любой глубины при конвертации. А вот в Linux не нашел, поэтому и спросил - может просто не увидел.
Правда вчера установил JRiver в ROSA, работает, но еще не попробовал что там с конвертацией.
Обработка вложенных каталогов
Добавлено: 09 сен 2018, 16:59
PastorDi
После конвертации, можно еще в одну строчку все перенести куда надо.
Код: Выделить всё
cp -r ~/mm ~/oo ; find ~/oo -name '*.mp3' -exec rm "{}" \;
Например сконвертировали в ~/mm перенесли в ~/oo и все.
Обработка вложенных каталогов
Добавлено: 09 сен 2018, 19:10
mexx400
PastorDi писал(а): ↑09 сен 2018, 16:59
После конвертации, можно еще в одну строчку все перенести куда надо
Да.
И еще одну - почистить за собой:
Вот и скрипт сложился
Обработка вложенных каталогов
Добавлено: 09 сен 2018, 20:43
PastorDi
Тогда уж вместо cp использовать mv и чистить не надо будет.
Обработка вложенных каталогов
Добавлено: 09 сен 2018, 23:32
sponikor
soundkonverter умеет (не перепутайте с SoundConverter)
Обработка вложенных каталогов
Добавлено: 10 сен 2018, 12:13
mexx400
sponikor писал(а): ↑09 сен 2018, 23:32
soundkonverter умеет
Да, это то, что нужно. Спасибо!
Я в базовых настройках искал, а оказывается надо быть внимательным при формировании конкретной задачи.
[РЕШЕНО] Обработка вложенных каталогов
Добавлено: 10 сен 2018, 19:18
mexx400
PastorDi писал(а): ↑09 сен 2018, 20:43
Тогда уж вместо cp использовать mv и чистить не надо будет
Я тоже так сначала подумал, но потом подумал ещё
- не получится так. Она (mv) сможет перенести файлы, но как она разложит эти файлы по каталогам? Это уже более сложный (по моим меркам) скрипт нужен.
Кстати, наверное проще удалять так:
[РЕШЕНО] Обработка вложенных каталогов
Добавлено: 11 сен 2018, 20:53
notauser
mexx400 писал(а): ↑10 сен 2018, 19:18
Это уже более сложный (по моим меркам) скрипт нужен.
После окончания конвертации
Код: Выделить всё
rsync -vr --include '*.mp3' --exclude '*.*' --remove-source-files /ваш/DIR/ /куда
В /куда получите структуру DIR (без DIR) и все файлы mp3 в "нужных местах". В случае успеха из всего что в /ваш/DIR/ все файлы *.mp3 будут удалены. При использовании опции
-m каталоги, не содержащие в своей структуре *.mp3 вообще в /куда создаваться не будут.
[РЕШЕНО] Обработка вложенных каталогов
Добавлено: 11 сен 2018, 21:40
notauser
PastorDi писал(а): ↑09 сен 2018, 16:59
После конвертации, можно еще в одну строчку все перенести куда надо.
Код: Выделить всё
cp -r ~/mm ~/oo ; find ~/oo -name '*.mp3' -exec rm "{}" \;
Например сконвертировали в ~/mm перенесли в ~/oo и все.
Плохая идея. Копирует всё - долго, может не хватить места. А потом удаляет.
[РЕШЕНО] Обработка вложенных каталогов
Добавлено: 12 сен 2018, 12:57
mexx400
notauser писал(а): ↑11 сен 2018, 20:53
После окончания конвертации
Да, тоже подумал про rsync - идеально для такого скрипта. Еще пробовал cpio с параметром -d
И все же, в моем случае, скрипт не так юзабелен, как GUI. Но познавательно.
Пользуясь случаем.
Код: Выделить всё
find ~/mm -type f -name '*.mp3' -exec bash -c 'ffmpeg -i "$0" -c:a libvorbis -q:a 2 "${0/%mp3/ogg}"' '{}' \;
Зачем "\;" в конце строки? Чтобы команда поняла, что аргументы закончились?
Вернее, почему оператор экранирован понятно. Но зачем он там?
А, нашел:
Код: Выделить всё
man find
***
-exec command ;
Execute command; true if 0 status is returned. All following arguments to find are taken to
be arguments to the command until an argument consisting of `;' is encountered.
[РЕШЕНО] Обработка вложенных каталогов
Добавлено: 12 сен 2018, 19:16
notauser
Да.
\ "экранирует" символ
;. Можно
';' И еще можете сравнить выхлоп:
Код: Выделить всё
find ~/mm -type f -name '*.mp3' -exec echo "Найдено:" '{}' \;
и
Код: Выделить всё
find ~/mm -type f -name '*.mp3' -exec echo "Найдено:" '{}' \+
+, в принципе, "экранировать" не обязательно и работает только с '{}'
[РЕШЕНО] Обработка вложенных каталогов
Добавлено: 12 сен 2018, 20:56
mexx400
notauser, так визуально понятнее:
Код: Выделить всё
find ~/mm -type f -name '*.mp3' -exec echo "Найдено:" '{}' \;
[РЕШЕНО] Обработка вложенных каталогов
Добавлено: 12 сен 2018, 21:13
notauser
Потому, что в первом случае ( \;) echo "Найдено:" срабатывает для каждого найденного *.mp3 отдельно, а во втором ( \+) - один раз для всех (при условии, что все символы уместились в одну строку). Это и есть "принципиальное отличие"
опции -exec команды find, задаваемое \; или +.
[РЕШЕНО] Обработка вложенных каталогов
Добавлено: 14 сен 2018, 19:15
mexx400
Пытаюсь сделать действие конвертации для контекстного меню Dolphin.
Не могу разобраться - как в скрипте привязаться к выбранному ПКМ каталогу?
[РЕШЕНО] Обработка вложенных каталогов
Добавлено: 14 сен 2018, 20:48
notauser
Про Dolphin не скажу. Не пользуюсь. Но это должно работать:
привязаться к выбранному ПКМ каталогу (только каталог):
/путь/каталог (без / в конце):
[РЕШЕНО] Обработка вложенных каталогов
Добавлено: 14 сен 2018, 21:18
mexx400
notauser писал(а): ↑14 сен 2018, 20:48
Но это должно работать:
И таки отлично работает. Спасибо!
Контекстное действие запускает скрипт:
Код: Выделить всё
export DST=$HOME/AVTO
find "$1" -type f -name '*.flac' -exec bash -c 'flac -cd "$0" | lame --alt-preset extreme - "${0/%flac/mp3}"' '{}' \;
rsync -auh --include '*.mp3' --exclude '*.*' --remove-source-files "$1" $DST
В своей музыке выбираю нужный мне каталог, ПКМ, действие "Конвертировать для автомобиля" --> и в целевом каталоге получаю уже выбранный каталог в .mp3 Теперь действительно стало удобнее, чем в GUI
[РЕШЕНО] Обработка вложенных каталогов
Добавлено: 14 сен 2018, 22:47
notauser
Код: Выделить всё
DST=`kdialog --getexistingdirectory $HOME/AVTO`
и при необходимости можно будет сразу выбрать флешку. И на всякий - в конце rsync "$DST"
[РЕШЕНО] Обработка вложенных каталогов
Добавлено: 15 сен 2018, 23:43
mexx400
О, не знал что так можно
Интересно.
notauser писал(а): ↑14 сен 2018, 22:47
И на всякий - в конце rsync "$DST"
Да, это я знаю. Но я конвертирую сначала на диск - мне так удобнее.
А еще вопрос - в коллекции все же есть альбомы не .flac (например, .mp3). Как сначала проверить, что в "$1" файлы именно .flac?
Не могу понять утилиту test
[РЕШЕНО] Обработка вложенных каталогов
Добавлено: 16 сен 2018, 23:46
mexx400
Пока так:
Код: Выделить всё
export DST=$HOME/AVTO
export FLC=$(find "$1" -type f -name "*.flac" | wc -l)
export MPT=$(find "$1" -type f -name "*.mp3" | wc -l)
if [[ $FLC -gt 0 ]]; then
find "$1" -type f -name '*.flac' -exec bash -c 'flac -cd "$0" | lame --alt-preset extreme - "${0/%flac/mp3}"' '{}' \;
rsync -auh --include '*.mp3' --exclude '*.*' --remove-source-files "$1" $DST
fi
if [[ $MPT -gt 0 ]]; then
rsync -auh --include '*.mp3' --exclude '*.*' "$1" $DST
fi
Если каталог с только .mp3 или только с .flac --> всё хорошо. Но если каталог "смешанный", то после конвертирования .flac в .mp3 копируются и удаляются в источнике ВСЕ .mp3 Это плохо.
[РЕШЕНО] Обработка вложенных каталогов
Добавлено: 17 сен 2018, 11:52
mexx400
mexx400 писал(а): ↑16 сен 2018, 23:46
после конвертирования .flac в .mp3 копируются и удаляются в источнике ВСЕ .mp3
Использовал переименование:
Код: Выделить всё
export DST=$HOME/AVTO
export MPT=$(find "$1" -type f -name "*.mp3" | wc -l)
export FLC=$(find "$1" -type f -name "*.flac" | wc -l)
if [[ $MPT -gt 0 ]]; then
rsync -auh --include '*.mp3' --exclude '*.*' "$1" $DST
fi
if [[ $FLC -gt 0 ]]; then
find "$1" -type f -name '*.flac' -exec bash -c 'flac -cd "$0" | lame --alt-preset extreme - "${0/%flac/mp3x}"' '{}' \;
rsync -auh --include '*.mp3x' --exclude '*.*' --remove-source-files "$1" $DST
fi
find $DST -type f -name "*.mp3x" -exec bash -c 'mv "$0" "${0/%mp3x/mp3}"' '{}' \;
Работает как надо. Можно как-то оптимальнее?
[РЕШЕНО] Обработка вложенных каталогов
Добавлено: 20 сен 2018, 18:57
mexx400
PastorDi писал(а): ↑09 сен 2018, 13:09
Всего одна строчка и все
Чтобы из-под Dolphin удобно выбирать каталоги/отдельные файлы .flac или .mp3 и конвертировать их "одним кликом" одна строчка плавно превратилась вот во что:
Код: Выделить всё
#!/bin/bash
:
kdialog --title "Скрипт конвертации:" --passivepopup "Скрипт начал работу ..." 2
# Проверка пустого каталога:
if [[ `ls -a "$1" | wc -l` -eq 2 ]]
then sleep 2 && kdialog --title "Скрипт конвертации:" --passivepopup "Это пустой каталог. Отмена." 4 & exit ; fi
# Переменные:
if [[ -d "$1" ]]; then export IST="$1" ; fi
if [[ -f "$1" ]]; then export IST="$PWD" ; fi
export DST=$USER/AVTO
export FLC=$(find "$1" -type f -iname "*.flac" | wc -l)
export MPT=$(find "$1" -type f -iname "*.mp3" | wc -l)
export WAV=$(find "$1" -type f -iname "*.wav" | wc -l)
export ACT=$(find "$1" -type f -iname "*.flac" -exec bash -c 'flac -cd "$0" | lame --alt-preset extreme - "${0/%flac/mp3x}"' '{}' \;)
export RSF=$(rsync -ru --include '*.mp3x' --exclude '*.*' --remove-source-files "$IST" $DST)
export RSM=$(rsync -ru --include '*.mp3' --exclude '*.*' "$IST" $DST)
export FNL=$(find $DST -type f -iname "*.mp3x" -exec bash -c 'mv "$0" "${0/%mp3x/mp3}"' '{}' \;)
# Проверка неподдерживаемых форматов:
if [[ $FLC -eq 0 && $MPT -eq 0 ]]
then kdialog --title "Скрипт конвертации:" --passivepopup "Здесь нет файлов FLAC или MP3. Отмена." 4 & exit ; fi
# Для формата FLAC:
if [[ $FLC -gt 0 ]]; then $ACT ; $RSF ; $FNL ; fi
# Для формата MP3:
if [[ $MPT -gt 0 ]]; then $RSM ; fi
kdialog --title "Скрипт конвертации:" --passivepopup "Скрипт завершил работу." 4
:
exit 0
Но узнал много интересного