Se o diretório de saída não existir, o VLC falhará com essa mensagem exata.
Esta é uma pequena expansão do script. No estado atual, ele pega diretórios como argumentos e faz um loop através deles. Se nenhum argumento for fornecido, ele procurará arquivos no diretório atual. Os arquivos de saída são gravados no diretório inicial, em um subdiretório nomeado como o diretório pai de cada arquivo fornecido. Os diretórios de saída são criados após a chamada para evitar a mensagem de erro.
#!/bin/sh
usage() {
cat <<-USAGE 1>&2
usage: ${0##*/} [DIR ...]
optional arguments:
DIR directories to search. Use current directory if none are given.
USAGE
exit 1
}
error() {
printf '%s: error: %s, aborting.\n' "${0##*/}" "$1" 1>&2
exit $2
}
transcode_dir() {
indir=$(readlink -f -- "$1")
outdir="$HOME/${indir##*/}"
! mkdir -pv -- "$outdir" && error "cannot create directory \"$outdir\"" 3
cd -- "$indir"
for a in *.$fmt; do
$vlc -I dummy -vvv "$a" --sout "#transcode{acodec=$acodec,ab=$arate,channels=2}:duplicate{dst=std{access=file,mux=ogg,dst=\"$outdir/${a%.*}.$ext\"}}" vlc://quit
done
cd - 2> /dev/null
}
while getopts "h" option; do
case $option in
h|\? ) usage;;
esac
done
shift $((OPTIND-1))
acodec="vorb"
arate="256"
ext="ogg"
vlc="/usr/bin/vlc"
fmt="mp3"
if [ $# -eq 0 ]; then
transcode_dir .
else
while [ $# -ge 1 ]; do
[ ! -d "$1" ] && error "not a directory: \"$1\"" 2
transcode_dir "$1"
shift
done
fi
Muitas linhas, mas a maioria é apenas um código de placa de caldeira colada (sinta-se à vontade para perguntar se alguma parte não está clara). Eu mudei o interpretador para #!/bin/sh
desde que nenhuma construção específica de Bash foi usada. Mudei a parte de transcodificação para uma função para maior clareza.