Это ?
— это просто символ-заполнитель, выводимый ls
для представления символа новой строки, который вы внедрили в имя файла.
echo foo3bar.mp4 | grep -Eo '[0-9]+'
будет выводить:
3
4
Поскольку в этом имени файла есть две последовательности из 1 или более десятичных цифр.
Вместо этого вы могли бы сделать:
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
Это позволит извлечь правильную -наиболее последовательность десятичных цифр в имени файла, лишенном его расширения, и избежать выполнения нескольких команд для каждого файла.
Обратите внимание, что в этом коде используется только стандартный синтаксис sh POSIX, поэтому для его запуска bash
не требуется. С bash
или другимиksh93
-подобными оболочками, если вы знаете, что корневое имя файла содержит только одну последовательность цифр, вы также можете использовать:
n=${file%.*} # remove the extension
n=${n//[^0-9]} # remove all non-digit characters
Сbash
-особенностями:
[[ $file =~ ([0-9]+).*\. ]] && n=${BASH_REMATCH[1]}
Будет извлечена левая -самая последовательность цифр в корневом имени.
Сzsh
:
n=${(SM)${file:r}##<->}