Преобразование файлов в каталоги, которые не всегда есть

У меня есть скрипт, который запускается, когда загрузка торрента завершена, чтобы увидеть, есть ли аудиофайлы FLAC, и если да, то конвертировать их в MP3. До сегодняшнего дня я использовал:

for file in "$torrentpath"/"$torrentname"/*.flac
do
    ffmpeg -i "$file" -qscale:a 0 "${file[@]/%flac/mp3}"

done

Но я понял, что когда приходит торрент с подкаталогами, скрипт бесполезен. Последние несколько дней я пытался возиться с «найти» и «если» и другими способами, но я не вижу ответа. Я знаю, что это там.

Сценарий должен просто проверить, есть ли подкаталоги, и выполнить для них ffmpeg, в противном случае сразу перейти к преобразованию.

Любой маленький намек будет оценен.


person left    schedule 14.11.2013    source источник


Ответы (2)


для обработки произвольных подкаталогов в bash:

shopt -s globstar nullglob
for file in "$torrentpath/$torrentname"/**/*.flac
do ...
person glenn jackman    schedule 14.11.2013
comment
Это как... золото, по крайней мере для меня. Большое спасибо. - person left; 15.11.2013

person    schedule
comment
Это решение не работает, если имена файлов содержат пробелы. Как правило, не анализируйте вывод find, если вы не примете все необходимые меры предосторожности. Вы могли бы очень красиво переписать это, используя команду -exec для find. - person gniourf_gniourf; 15.11.2013
comment
@gniourf_gniourf, как бы вы справились с управлением именем файла в find -exec? - person glenn jackman; 15.11.2013
comment
@glennjackman, например, find "$torrentpath/$torrentname" -name '*.flac' -exec bash -c 'ffmpeg -i "$1" -qscale:a 0 "${1[@]/%flac/mp3}"' _ {} \;. (хорошо, это -exec+bash, но, тем не менее, очень надежный и, кроме того, может быть быстрее, чем глобы, если каталог огромен, поскольку глобы сортируются). - person gniourf_gniourf; 15.11.2013
comment
но вы должны запускать процесс bash для каждого совпадения, что замедлит вас (вероятно, не слишком заметно по сравнению с выполнением ffmpeg) - person glenn jackman; 15.11.2013
comment
@glennjackman конечно ... тогда вы могли бы: find "$torrentpath/$torrentname" -name '*.flac' -exec bash -c 'for i in "$@"; do ffmpeg -i "$i" -qscale:a 0 "${i[@]/%flac/mp3}"; done' _ {} + и оказывается, что это может быть намного быстрее, чем одни только bash globs. В любом случае, для меня решение, которое вы дали, является лучшим (и я проголосовал за него ;)), особенно здесь, поскольку в каждом торренте может быть не так много файлов. - person gniourf_gniourf; 15.11.2013