Esse ?
é apenas um caractere de espaço reservado gerado por ls
para representar o caractere de nova linha que você incorporou ao seu nome de arquivo.
echo foo3bar.mp4 | grep -Eo '[0-9]+'
produziria:
3
4
Como existem duas sequências de 1 ou mais dígitos decimais nesse nome de arquivo.
Em vez disso, você poderia fazer:
for file in *[0-9]*.mp4; do
n=${file%.*} # remove the extension
n=${n%"${n##*[0-9]}"} # remove anything after the last digit
n=${n##*[!0-9]} # remove everything up to the last non-digit.
ffmpeg...
done
O que extrairia a seqüência de dígitos decimais mais à direita no nome do arquivo removido de sua extensão e evitaria executar vários comandos para cada arquivo.
Observe que esse código usa apenas a sintaxe POSIX sh padrão, portanto, você não precisa do bash
para executá-lo. Com bash
ou outros shells iguais aksh93
, se você souber que o nome da raiz do arquivo contém apenas uma seqüência de dígitos, você também pode usar:
n=${file%.*} # remove the extension
n=${n//[^0-9]} # remove all non-digit characters
Com recursos especiais de bash
:
[[ $file =~ ([0-9]+).*\. ]] && n=${BASH_REMATCH[1]}
Extrairia a sequência de dígitos mais à esquerda no nome raiz.
com zsh
:
n=${(SM)${file:r}##<->}