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

Ответить
mexx400
Сообщения: 394
Зарегистрирован: 13 окт 2013, 16:06
Operating system: Ноутбук MSI & ROSA R10 Plasma [amd64] & Debian 8 MATE [amd64]

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

Сообщение mexx400 » 31 авг 2018, 23:01

Здравствуйте. ROSA10/64/Plasma.
В какой программе можно сконвертировать аудиофайлы, чтобы на выходе сохранялась входящая структура каталогов? То есть в каталоге DIR имеются каталоги DIR1, DIR2, DIR3 ... DIR100, в каждом из которых, в свою очередь, имеются вложенные каталоги. Как после конвертации аудиофайлов получить на выходе такую же структуру, но уже с файлами нового формата? Под Windows нашел, а вот в Linux (пробовал Clementene и SoundConverter) на выходе всё валится в одну кучу (может не увидел какую настройку, конечно). Или только скрипт?
Последний раз редактировалось mexx400 10 сен 2018, 12:13, всего редактировалось 1 раз.
Debian 8 MATE [amd64]
ROSA Desktop R10 Plasma [amd64] *4
ROSA Desktop R10 Plasma [x86]

PastorDi
Сообщения: 2594
Зарегистрирован: 25 авг 2011, 12:34
Operating system: IBM DOS, OS/2
Откуда: Санкт-Петербург
Контактная информация:

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

Сообщение PastorDi » 09 сен 2018, 13:09

Всего одна строчка и все. Например у меня в папке ~/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 , а дальше делайте что хотите с ними.

mexx400
Сообщения: 394
Зарегистрирован: 13 окт 2013, 16:06
Operating system: Ноутбук MSI & ROSA R10 Plasma [amd64] & Debian 8 MATE [amd64]

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

Сообщение mexx400 » 09 сен 2018, 15:12

PastorDi писал(а):
09 сен 2018, 13:09
Всего одна команда:
Спасибо за ответ.
Но это немного не то.
Действительно, все файлы .mp3 конвертируются в файлы .ogg Но .ogg будут лежать в том же каталоге, что и .mp3
А мне надо:
mexx400 писал(а):
31 авг 2018, 23:01
после конвертации аудиофайлов получить на выходе такую же структуру, но уже с файлами нового формата
На самом деле задача чисто бытовая - музыку храню преимущественно во .flac Структура каталогов самая простая - жанр/исполнитель/альбом. Но аудио в машине не читает .flac Поэтому дома конвертирую .flac в .mp3 и на флешку. Но когда исполнителей/альбомов более одного, то слушать в машине некую кучу неудобно. Поэтому хочется сохранить структуру каталогов. В Windows у меня плеер JRiver и он предлагает создать соответствующую структуру каталогов любой глубины при конвертации. А вот в Linux не нашел, поэтому и спросил - может просто не увидел.
Правда вчера установил JRiver в ROSA, работает, но еще не попробовал что там с конвертацией.
Debian 8 MATE [amd64]
ROSA Desktop R10 Plasma [amd64] *4
ROSA Desktop R10 Plasma [x86]

PastorDi
Сообщения: 2594
Зарегистрирован: 25 авг 2011, 12:34
Operating system: IBM DOS, OS/2
Откуда: Санкт-Петербург
Контактная информация:

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

Сообщение PastorDi » 09 сен 2018, 16:59

После конвертации, можно еще в одну строчку все перенести куда надо.

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

cp -r ~/mm ~/oo ; find ~/oo -name '*.mp3' -exec rm "{}" \;
Например сконвертировали в ~/mm перенесли в ~/oo и все.

mexx400
Сообщения: 394
Зарегистрирован: 13 окт 2013, 16:06
Operating system: Ноутбук MSI & ROSA R10 Plasma [amd64] & Debian 8 MATE [amd64]

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

Сообщение mexx400 » 09 сен 2018, 19:10

PastorDi писал(а):
09 сен 2018, 16:59
После конвертации, можно еще в одну строчку все перенести куда надо
Да.
И еще одну - почистить за собой:

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

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

PastorDi
Сообщения: 2594
Зарегистрирован: 25 авг 2011, 12:34
Operating system: IBM DOS, OS/2
Откуда: Санкт-Петербург
Контактная информация:

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

Сообщение PastorDi » 09 сен 2018, 20:43

Тогда уж вместо cp использовать mv и чистить не надо будет. :)

Аватара пользователя
sponikor
Сообщения: 222
Зарегистрирован: 04 май 2013, 18:39
Operating system: rosa lxqt

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

Сообщение sponikor » 09 сен 2018, 23:32

soundkonverter умеет (не перепутайте с SoundConverter)
Вложения
1.png

mexx400
Сообщения: 394
Зарегистрирован: 13 окт 2013, 16:06
Operating system: Ноутбук MSI & ROSA R10 Plasma [amd64] & Debian 8 MATE [amd64]

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

Сообщение mexx400 » 10 сен 2018, 12:13

sponikor писал(а):
09 сен 2018, 23:32
soundkonverter умеет
Да, это то, что нужно. Спасибо!
Я в базовых настройках искал, а оказывается надо быть внимательным при формировании конкретной задачи.
Debian 8 MATE [amd64]
ROSA Desktop R10 Plasma [amd64] *4
ROSA Desktop R10 Plasma [x86]

mexx400
Сообщения: 394
Зарегистрирован: 13 окт 2013, 16:06
Operating system: Ноутбук MSI & ROSA R10 Plasma [amd64] & Debian 8 MATE [amd64]

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

Сообщение mexx400 » 10 сен 2018, 19:18

PastorDi писал(а):
09 сен 2018, 20:43
Тогда уж вместо cp использовать mv и чистить не надо будет
Я тоже так сначала подумал, но потом подумал ещё :) - не получится так. Она (mv) сможет перенести файлы, но как она разложит эти файлы по каталогам? Это уже более сложный (по моим меркам) скрипт нужен.

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

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

find ~/nm -name '*.ogg' -delete
Debian 8 MATE [amd64]
ROSA Desktop R10 Plasma [amd64] *4
ROSA Desktop R10 Plasma [x86]

notauser
Сообщения: 1149
Зарегистрирован: 06 май 2012, 21:00

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

Сообщение notauser » 11 сен 2018, 20:53

mexx400 писал(а):
10 сен 2018, 19:18
Это уже более сложный (по моим меркам) скрипт нужен.
После окончания конвертации

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

rsync -vr --include '*.mp3' --exclude '*.*' --remove-source-files /ваш/DIR/ /куда
В /куда получите структуру DIR (без DIR) и все файлы mp3 в "нужных местах". В случае успеха из всего что в /ваш/DIR/ все файлы *.mp3 будут удалены. При использовании опции -m каталоги, не содержащие в своей структуре *.mp3 вообще в /куда создаваться не будут.

notauser
Сообщения: 1149
Зарегистрирован: 06 май 2012, 21:00

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

Сообщение notauser » 11 сен 2018, 21:40

PastorDi писал(а):
09 сен 2018, 16:59
После конвертации, можно еще в одну строчку все перенести куда надо.

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

cp -r ~/mm ~/oo ; find ~/oo -name '*.mp3' -exec rm "{}" \;
Например сконвертировали в ~/mm перенесли в ~/oo и все.
Плохая идея. Копирует всё - долго, может не хватить места. А потом удаляет.

mexx400
Сообщения: 394
Зарегистрирован: 13 окт 2013, 16:06
Operating system: Ноутбук MSI & ROSA R10 Plasma [amd64] & Debian 8 MATE [amd64]

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

Сообщение mexx400 » 12 сен 2018, 12:57

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.
Debian 8 MATE [amd64]
ROSA Desktop R10 Plasma [amd64] *4
ROSA Desktop R10 Plasma [x86]

notauser
Сообщения: 1149
Зарегистрирован: 06 май 2012, 21:00

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

Сообщение notauser » 12 сен 2018, 19:16

Да. \ "экранирует" символ ;. Можно ';' И еще можете сравнить выхлоп:

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

find ~/mm  -type f -name '*.mp3' -exec echo "Найдено:" '{}' \;
и

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

find ~/mm  -type f -name '*.mp3' -exec echo "Найдено:" '{}' \+
+, в принципе, "экранировать" не обязательно и работает только с '{}'

mexx400
Сообщения: 394
Зарегистрирован: 13 окт 2013, 16:06
Operating system: Ноутбук MSI & ROSA R10 Plasma [amd64] & Debian 8 MATE [amd64]

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

Сообщение mexx400 » 12 сен 2018, 20:56

notauser, так визуально понятнее:

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

find ~/mm  -type f -name '*.mp3' -exec echo "Найдено:" '{}' \;
Debian 8 MATE [amd64]
ROSA Desktop R10 Plasma [amd64] *4
ROSA Desktop R10 Plasma [x86]

notauser
Сообщения: 1149
Зарегистрирован: 06 май 2012, 21:00

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

Сообщение notauser » 12 сен 2018, 21:13

Потому, что в первом случае ( \;) echo "Найдено:" срабатывает для каждого найденного *.mp3 отдельно, а во втором ( \+) - один раз для всех (при условии, что все символы уместились в одну строку). Это и есть "принципиальное отличие" :) опции -exec команды find, задаваемое \; или +.

mexx400
Сообщения: 394
Зарегистрирован: 13 окт 2013, 16:06
Operating system: Ноутбук MSI & ROSA R10 Plasma [amd64] & Debian 8 MATE [amd64]

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

Сообщение mexx400 » 14 сен 2018, 19:15

Пытаюсь сделать действие конвертации для контекстного меню Dolphin.
Не могу разобраться - как в скрипте привязаться к выбранному ПКМ каталогу?
Debian 8 MATE [amd64]
ROSA Desktop R10 Plasma [amd64] *4
ROSA Desktop R10 Plasma [x86]

notauser
Сообщения: 1149
Зарегистрирован: 06 май 2012, 21:00

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

Сообщение notauser » 14 сен 2018, 20:48

Про Dolphin не скажу. Не пользуюсь. Но это должно работать:
привязаться к выбранному ПКМ каталогу (только каталог): /путь/каталог (без / в конце):

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

realpath "$1"

mexx400
Сообщения: 394
Зарегистрирован: 13 окт 2013, 16:06
Operating system: Ноутбук MSI & ROSA R10 Plasma [amd64] & Debian 8 MATE [amd64]

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

Сообщение mexx400 » 14 сен 2018, 21:18

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 :)
Debian 8 MATE [amd64]
ROSA Desktop R10 Plasma [amd64] *4
ROSA Desktop R10 Plasma [x86]

notauser
Сообщения: 1149
Зарегистрирован: 06 май 2012, 21:00

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

Сообщение notauser » 14 сен 2018, 22:47

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

DST=`kdialog --getexistingdirectory $HOME/AVTO`
и при необходимости можно будет сразу выбрать флешку. И на всякий - в конце rsync "$DST"

mexx400
Сообщения: 394
Зарегистрирован: 13 окт 2013, 16:06
Operating system: Ноутбук MSI & ROSA R10 Plasma [amd64] & Debian 8 MATE [amd64]

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

Сообщение mexx400 » 15 сен 2018, 23:43

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

kdialog --getexistingdirectory
О, не знал что так можно :) Интересно.
notauser писал(а):
14 сен 2018, 22:47
И на всякий - в конце rsync "$DST"
Да, это я знаю. Но я конвертирую сначала на диск - мне так удобнее.

А еще вопрос - в коллекции все же есть альбомы не .flac (например, .mp3). Как сначала проверить, что в "$1" файлы именно .flac?
Не могу понять утилиту test

mexx400
Сообщения: 394
Зарегистрирован: 13 окт 2013, 16:06
Operating system: Ноутбук MSI & ROSA R10 Plasma [amd64] & Debian 8 MATE [amd64]

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

Сообщение mexx400 » 16 сен 2018, 23:46

Пока так:

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

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 Это плохо.
Debian 8 MATE [amd64]
ROSA Desktop R10 Plasma [amd64] *4
ROSA Desktop R10 Plasma [x86]

mexx400
Сообщения: 394
Зарегистрирован: 13 окт 2013, 16:06
Operating system: Ноутбук MSI & ROSA R10 Plasma [amd64] & Debian 8 MATE [amd64]

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

Сообщение mexx400 » 17 сен 2018, 11:52

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}"' '{}' \;
Работает как надо. Можно как-то оптимальнее?
Debian 8 MATE [amd64]
ROSA Desktop R10 Plasma [amd64] *4
ROSA Desktop R10 Plasma [x86]

mexx400
Сообщения: 394
Зарегистрирован: 13 окт 2013, 16:06
Operating system: Ноутбук MSI & ROSA R10 Plasma [amd64] & Debian 8 MATE [amd64]

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

Сообщение mexx400 » 20 сен 2018, 18:57

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
Но узнал много интересного :)

Ответить