LINUX.ORG.RU

Пройтись по всем директориям и выполнить команду.

 , ,


0

2

Сап, лор. Есть у меня скрипт, который перегоняет весь .flac в .mp3 через ffmpeg. Работает это так:

cd ./Music/Adept
convertFlacToMp3
По окончании в этой папке имеем .flac и .mp3 файлы.
Но! Сейчас мне надо перегнать таким боком всю мою библиотеку, а это порядка 45 исполнителей и у каждого по паре альбомов, руками я это буду делать год, потому у меня вопрос, как это дело правильно сделать? Понимаю, что накалякать скрипт на баше, но как - не знаю, ибо с ним особо не знаком.
P.S. кейс получается такой:
В дирректории Music есть n дирректорий, внутри некоторых есть еще 2-3 (альбомы), а в них уже .flac. Надо пройтись от Music по всем дирректориям и вызвать в них convertFlacToMp3.

★★★★

Пройти по всем директориям, в которых есть flac-файлы, и вызвать в каждой скрипт convertFlacToMp3.

while read dir; do
    pushd "$dir"
    convertFlacToMp3
    popd
done < <(find . -iname '*.flac' -printf '%h\n' | sort -u)
intelfx ★★★★★
()
Последнее исправление: intelfx (всего исправлений: 1)
Ответ на: комментарий от intelfx

Добавлю уточнение, по всем начиная с той, откуда скрипт был вызван. Например если я выполню его из ./Music - он пойдет только по дирректориям, которые внутри, и не затронет, например ../Backup/Music.
Как в данном случае поведет себя ваш скрипт?

Jefail ★★★★
() автор топика
Ответ на: комментарий от intelfx

Спасибо! Пойду тестировать.

Jefail ★★★★
() автор топика
Ответ на: комментарий от intelfx

Отработало только с одной поддиректорией, т.е. /Music/Adept/track.flac сработало, а например /Music/Hollywood\ Undead/2008/track.flac пропустил.

Jefail ★★★★
() автор топика
Ответ на: комментарий от intelfx

Так, тут похоже я накосячил. У меня convertFlacToMp3 - это алиас в bashrc, который ссылается на /opt/userScripts/convertFlacToMp3.sh.
Так вот, если взять твой вариант скрипта, он почему-то ругается на line 5: convertFlacToMp3 command not found
Если заменить в скрипте это на полный путь до .sh - работает, но останавливается после первой дирректории, хотя в выхлопе пишет все дирректории и все правильно.

Jefail ★★★★
() автор топика
Ответ на: комментарий от intelfx

Пройдёт по всем поддиректориям той директории, откуда был вызван.

Это вообще, дефолтное значение, точку можно опускать.

quest2017
()
Ответ на: комментарий от intelfx

Про parallel читал на арч вики, но у меня его нет, попробую сейчас подпилить под свои нужды и протестирую.

Jefail ★★★★
() автор топика
Ответ на: комментарий от dexpl

Нет. Указанный скрипт ищет все директории и запускает скрипт из их родительских директорий. В результате «листья» дерева директорий останутся необработанными.

intelfx ★★★★★
()
Последнее исправление: intelfx (всего исправлений: 2)
Ответ на: комментарий от intelfx

Чёрт, чувак, огромное спасибо, работает!

Jefail ★★★★
() автор топика
Ответ на: комментарий от Jefail

Отработало только с одной поддиректорией

Сколько вам дуракам не говори, а всё впустую.

Твой while отработал неправильно потому что ffmpeg читает stdin, забирая его у цикла while

надо ffmpeg ...... < /dev/null

anonymous
()
Ответ на: комментарий от salsa

find ~/Music -type d -execdir convertFlacToMp3

Неправильно

надо: find ~/Music -type f -name '*.flac' -execdir convertFlacToMp3 {} \;

anonymous
()
Ответ на: комментарий от intelfx

Нет. Указанный скрипт ищет все директории и запускает скрипт из их родительских директорий.

Искать надо ФАЙЛ, его родительская директория и будет та, в которую ТС делает cd

anonymous
()
Ответ на: комментарий от anonymous

Тогда от каждой директории скрипт будет вызван столько раз, сколько .flac-файлов в этой директории. Короче, execdir в совокупности с оригинальным скриптом здесь никак не применить.

intelfx ★★★★★
()
Последнее исправление: intelfx (всего исправлений: 1)
Ответ на: комментарий от anonymous

Я думаю это уже не важно, вариант intelfx у меня работает и даже лучше оригинального скрипта, ибо в нём не было многопоточности.

Jefail ★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.