См. http://mywiki.wooledge.org/BashFAQ/001 и http://mywiki.wooledge.org/DontReadLinesWithFor о том, как читать строки, которые потенциально содержат пробелы и другие специальные символы.
Есть тонна неправильного в том, как вы работаете с текстом в вашем сценарии. Во многих случаях он подвержен разрыву слов, который вам не нужен. За более подробной информацией обратитесь к Wooledge FAQ.
Аудиофайлы часто имеют имена с пробелами, так что это будет проблемой для вас.
Одним из способов сделать это будет использование возможности Bash'а extglob, чтобы избежать необходимости разбирать и находить вывод
. (find -exec ... {} +
будет другим способом).
shopt -s extglob
for wav in **/*.wav; do
mp4="${wav%.wav}.mp4" # strip off the .wav suffix, tack on .mp4
if ! [[ -e "$mp4" ]]; then
ffmpeg -i "$wav" -c:a libfdk_aac -b:a 96k "$mp4"
fi
done
Обратите внимание, что другие AAC-кодеры ffmpeg все еще не так хороши, как libfdk.
Вы можете использовать herestring <<<
для передачи строки в grep:
newnum=$(grep -oE '[0-9]+' <<< "$key" | sort -rn | head -n 1)
Это будет более эффективно, чем echo "$key" | grep
, создающее дополнительный процесс.
Не забудьте заключить ваши переменные в двойные кавычки, чтобы предотвратить разбиение слов и подстановку. См. также это .