Страница 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
После конвертации, можно еще в одну строчку все перенести куда надо
Да.
И еще одну - почистить за собой:

Код: Выделить всё

find ~/nm -name '*.ogg' -exec rm "{}" \;
Вот и скрипт сложился :)

Обработка вложенных каталогов

Добавлено: 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) сможет перенести файлы, но как она разложит эти файлы по каталогам? Это уже более сложный (по моим меркам) скрипт нужен.

Кстати, наверное проще удалять так:

Код: Выделить всё

find ~/nm -name '*.ogg' -delete

[РЕШЕНО] Обработка вложенных каталогов

Добавлено: 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 не скажу. Не пользуюсь. Но это должно работать:
привязаться к выбранному ПКМ каталогу (только каталог): /путь/каталог (без / в конце):

Код: Выделить всё

realpath "$1"

[РЕШЕНО] Обработка вложенных каталогов

Добавлено: 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

Код: Выделить всё

kdialog --getexistingdirectory
О, не знал что так можно :) Интересно.
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
Но узнал много интересного :)