В Bash, как делает тот, определяющий длину имени файла?

Если Вы знаете, что существует только 1 аудиопоток и что это aac, затем Вам только нужно это:

ffmpeg -acodec copy -i "movie.mp4" -y "audio.aac"

Если Вы хотите написать сценарий первого идентификатора аудиопотока и типа кодека/расширения файла, можно использовать это:

eval $(ffmpeg -i "movie.mp4" 2>&1 |awk '/Stream.*Audio/{print "stream=" $2 ";codec=" $4}' |head -n1)
stream=${stream:1}; stream=${stream/:/}
extn=${codec/,/}; [[ $extn == "aac" ]] || 
    { echo "You need to manually set the fiie extension. Codec type is: $codec"; exit 1; } 

ffmpeg -map $stream -acodec copy -i "movie.mp4" "audio.$extn"
5
26.09.2013, 16:09
5 ответов

Можно использовать ${#VAR} получить длину переменной $VAR:

if [ "${#filename}" -eq 5 ]; then
   rename_file
fi
11
27.01.2020, 20:31
  • 1
    Обратите внимание, что длина выражается в количестве символов с некоторыми оболочками и числе байтов в некоторых других. –  Stéphane Chazelas 26.09.2013, 15:38
  • 2
    @StephaneChazelas можно ли объяснить, почему Вы добавили кавычки? По моему скромному мнению, ${#..} должен возвратить просто число во всех случаях. –  jofel 26.09.2013, 17:46
  • 3
    Отъезд переменной закрыл кавычки в split+glob операторе. Вы не хотите ни одного здесь, таким образом, это должно быть заключено в кавычки, как обычно. Это не относится к тому, что содержит переменная. –  Stéphane Chazelas 26.09.2013, 20:03
for file in ?????; do
  something with "$file"
done

Обработает только (нескрытые) файлы в текущем каталоге, имя которого состоит в 5 символах. Обратите внимание на это некоторыми оболочками как dash и некоторые реализации ksh, это - 5 байтов вместо 5 символов, которые могут иметь значение в многобайтовых локалях.

Для тех тех же оболочек, ${#var} расширится до числа байтов в переменной вместо количества символов.

6
27.01.2020, 20:31

С ударом можно вызвать Арифметический Контекст

if (( ${#filename} == 5 )); then
   :
fi
4
27.01.2020, 20:31

Скажите, "filename.txt" является файлом затем, можно использовать,

    file=`echo "fileName.txt" | cut -d'.' -f1`
    if [ ${#file} -ge 5 ]; then
       #you can rename your filename accordingly
    fi 
2
27.01.2020, 20:31
  • 1
    Или даже filename=fileName.txt file=${filename%.*} –  Joseph R. 26.09.2013, 14:59
if len(file) >= 5 chars
   then ren(file) $_;
end if
-1
27.01.2020, 20:31

Теги

Похожие вопросы