[РЕШЕНО] Обработка вложенных каталогов
[РЕШЕНО] Обработка вложенных каталогов
Здравствуйте. ROSA10/64/Plasma.
В какой программе можно сконвертировать аудиофайлы, чтобы на выходе сохранялась входящая структура каталогов? То есть в каталоге DIR имеются каталоги DIR1, DIR2, DIR3 ... DIR100, в каждом из которых, в свою очередь, имеются вложенные каталоги. Как после конвертации аудиофайлов получить на выходе такую же структуру, но уже с файлами нового формата? Под Windows нашел, а вот в Linux (пробовал Clementene и SoundConverter) на выходе всё валится в одну кучу (может не увидел какую настройку, конечно). Или только скрипт?
В какой программе можно сконвертировать аудиофайлы, чтобы на выходе сохранялась входящая структура каталогов? То есть в каталоге DIR имеются каталоги DIR1, DIR2, DIR3 ... DIR100, в каждом из которых, в свою очередь, имеются вложенные каталоги. Как после конвертации аудиофайлов получить на выходе такую же структуру, но уже с файлами нового формата? Под Windows нашел, а вот в Linux (пробовал Clementene и SoundConverter) на выходе всё валится в одну кучу (может не увидел какую настройку, конечно). Или только скрипт?
Последний раз редактировалось mexx400 10 сен 2018, 12:13, всего редактировалось 1 раз.
ROSA Fresh 12.3 Plasma [amd64]
Обработка вложенных каталогов
Всего одна строчка и все. Например у меня в папке ~/mm и его подпапках лежать .mp3, мне надо все .mp3 во всех вложенных папках конвертануть в .ogg. Всего одна команда:
И у меня в этих же папках и подпапках будут сконвертированные .ogg , а дальше делайте что хотите с ними.
Код: Выделить всё
find ~/mm -type f -name '*.mp3' -exec bash -c 'ffmpeg -i "$0" -c:a libvorbis -q:a 2 "${0/%mp3/ogg}"' '{}' \;
Обработка вложенных каталогов
Спасибо за ответ.
Но это немного не то.
Действительно, все файлы .mp3 конвертируются в файлы .ogg Но .ogg будут лежать в том же каталоге, что и .mp3
А мне надо:
На самом деле задача чисто бытовая - музыку храню преимущественно во .flac Структура каталогов самая простая - жанр/исполнитель/альбом. Но аудио в машине не читает .flac Поэтому дома конвертирую .flac в .mp3 и на флешку. Но когда исполнителей/альбомов более одного, то слушать в машине некую кучу неудобно. Поэтому хочется сохранить структуру каталогов. В Windows у меня плеер JRiver и он предлагает создать соответствующую структуру каталогов любой глубины при конвертации. А вот в Linux не нашел, поэтому и спросил - может просто не увидел.mexx400 писал(а): 31 авг 2018, 23:01 после конвертации аудиофайлов получить на выходе такую же структуру, но уже с файлами нового формата
Правда вчера установил JRiver в ROSA, работает, но еще не попробовал что там с конвертацией.
ROSA Fresh 12.3 Plasma [amd64]
Обработка вложенных каталогов
После конвертации, можно еще в одну строчку все перенести куда надо.
Например сконвертировали в ~/mm перенесли в ~/oo и все.
Код: Выделить всё
cp -r ~/mm ~/oo ; find ~/oo -name '*.mp3' -exec rm "{}" \;
Обработка вложенных каталогов
Да.PastorDi писал(а): 09 сен 2018, 16:59 После конвертации, можно еще в одну строчку все перенести куда надо
И еще одну - почистить за собой:
Код: Выделить всё
find ~/nm -name '*.ogg' -exec rm "{}" \;

Обработка вложенных каталогов
Тогда уж вместо cp использовать mv и чистить не надо будет. 

Обработка вложенных каталогов
Да, это то, что нужно. Спасибо!
Я в базовых настройках искал, а оказывается надо быть внимательным при формировании конкретной задачи.
ROSA Fresh 12.3 Plasma [amd64]
[РЕШЕНО] Обработка вложенных каталогов
Я тоже так сначала подумал, но потом подумал ещё

Кстати, наверное проще удалять так:
Код: Выделить всё
find ~/nm -name '*.ogg' -delete
ROSA Fresh 12.3 Plasma [amd64]
[РЕШЕНО] Обработка вложенных каталогов
После окончания конвертации
Код: Выделить всё
rsync -vr --include '*.mp3' --exclude '*.*' --remove-source-files /ваш/DIR/ /куда
[РЕШЕНО] Обработка вложенных каталогов
Плохая идея. Копирует всё - долго, может не хватить места. А потом удаляет.PastorDi писал(а): 09 сен 2018, 16:59 После конвертации, можно еще в одну строчку все перенести куда надо.Например сконвертировали в ~/mm перенесли в ~/oo и все.Код: Выделить всё
cp -r ~/mm ~/oo ; find ~/oo -name '*.mp3' -exec rm "{}" \;
[РЕШЕНО] Обработка вложенных каталогов
Да, тоже подумал про 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.
ROSA Fresh 12.3 Plasma [amd64]
[РЕШЕНО] Обработка вложенных каталогов
Да. \ "экранирует" символ ;. Можно ';' И еще можете сравнить выхлоп:
и
+, в принципе, "экранировать" не обязательно и работает только с '{}'
Код: Выделить всё
find ~/mm -type f -name '*.mp3' -exec echo "Найдено:" '{}' \;
Код: Выделить всё
find ~/mm -type f -name '*.mp3' -exec echo "Найдено:" '{}' \+
[РЕШЕНО] Обработка вложенных каталогов
notauser, так визуально понятнее:
Код: Выделить всё
find ~/mm -type f -name '*.mp3' -exec echo "Найдено:" '{}' \;
ROSA Fresh 12.3 Plasma [amd64]
[РЕШЕНО] Обработка вложенных каталогов
Потому, что в первом случае ( \;) echo "Найдено:" срабатывает для каждого найденного *.mp3 отдельно, а во втором ( \+) - один раз для всех (при условии, что все символы уместились в одну строку). Это и есть "принципиальное отличие"
опции -exec команды find, задаваемое \; или +.

[РЕШЕНО] Обработка вложенных каталогов
Пытаюсь сделать действие конвертации для контекстного меню Dolphin.
Не могу разобраться - как в скрипте привязаться к выбранному ПКМ каталогу?
Не могу разобраться - как в скрипте привязаться к выбранному ПКМ каталогу?
ROSA Fresh 12.3 Plasma [amd64]
[РЕШЕНО] Обработка вложенных каталогов
Про Dolphin не скажу. Не пользуюсь. Но это должно работать:
привязаться к выбранному ПКМ каталогу (только каталог):
/путь/каталог (без / в конце):
привязаться к выбранному ПКМ каталогу (только каталог):
Код: Выделить всё
"$1"
Код: Выделить всё
realpath "$1"
[РЕШЕНО] Обработка вложенных каталогов
И таки отлично работает. Спасибо!
Контекстное действие запускает скрипт:
Код: Выделить всё
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

ROSA Fresh 12.3 Plasma [amd64]
[РЕШЕНО] Обработка вложенных каталогов
Код: Выделить всё
DST=`kdialog --getexistingdirectory $HOME/AVTO`
[РЕШЕНО] Обработка вложенных каталогов
Код: Выделить всё
kdialog --getexistingdirectory

Да, это я знаю. Но я конвертирую сначала на диск - мне так удобнее.
А еще вопрос - в коллекции все же есть альбомы не .flac (например, .mp3). Как сначала проверить, что в "$1" файлы именно .flac?
[РЕШЕНО] Обработка вложенных каталогов
Пока так:
Если каталог с только .mp3 или только с .flac --> всё хорошо. Но если каталог "смешанный", то после конвертирования .flac в .mp3 копируются и удаляются в источнике ВСЕ .mp3 Это плохо.
Код: Выделить всё
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
ROSA Fresh 12.3 Plasma [amd64]
[РЕШЕНО] Обработка вложенных каталогов
Использовал переименование: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}"' '{}' \;
ROSA Fresh 12.3 Plasma [amd64]
[РЕШЕНО] Обработка вложенных каталогов
Чтобы из-под 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
