2016-07-22 13 views
0

Я пытаюсь написать простой сценарий перекодировки для резервных копий VHS с помощью ffmpeg. Но я не могу обрабатывать пробелы в именах файлов.Пробелы в имени файла для ffmpeg в bash

Я создаю команду ffmpeg вместе в скрипте и повторяю ее, а когда я скопирую вставку эхо-команды, она работает, но не прямо из скрипта.

Есть ли anayone идея, что не так с моим сценарием?

Сценарий:

#!/bin/bash 
# VHStoMP4Backup Script 

INPUT=$1 
OUTPUT="/Volumes/Data/oliver/Video/Encodiert/${2}" 

command="ffmpeg \ 
    -i \"$INPUT\" \ 
    -vcodec copy \ 
    -acodec copy \ 
    \"$OUTPUT\"" 


if [ ! -z "$1" ] && [ ! -z "$2" ] ; 
then 
    echo ${command}$'\n' 
    ${command} 
else 
    echo "missing parameters" 
    echo "Usage: script INPUT_FILENAME OUTPUT_FILENAME" 
fi 

exit 

Сценарий вызова:

./VHStoMP4Backup.sh /Volumes/Data/oliver/Video/RAW\ Aufnahmen/Ewelina\ -\ Kasette\ 1.dv ewe.mp4 

выход Commandline

olivers-mac-pro:Desktop oliver$ ./VHStoMP4Backup.sh /Volumes/Data/oliver/Video/RAW\ Aufnahmen/Ewelina\ -\ Kasette\ 1.dv ewe.mp4 
    ffmpeg -i "/Volumes/Data/oliver/Video/RAW Aufnahmen/Ewelina - Kasette 1.dv" -vcodec copy -acodec copy "/Volumes/Data/oliver/Video/Encodiert/ewe.mp4" 

    ffmpeg version git-2016-04-16-60517c3 Copyright (c) 2000-2016 the FFmpeg developers 
     built with Apple LLVM version 5.1 (clang-503.0.40) (based on LLVM 3.4svn) 
     configuration: --prefix=/usr/local/Cellar/ffmpeg/HEAD --enable-shared --enable-pthreads --enable-gpl --enable-version3 --enable-hardcoded-tables --enable-avresample --cc=clang --host-cflags= --host-ldflags= --enable-opencl --enable-libx264 --enable-libmp3lame --enable-libxvid --enable-libfreetype --enable-libvorbis --enable-libvpx --enable-librtmp --enable-libfaac --enable-libass --enable-libssh --enable-libspeex --enable-libfdk-aac --enable-openssl --enable-libopus --enable-libvidstab --enable-libx265 --enable-nonfree --enable-vda 
     libavutil  55. 22.100/55. 22.100 
     libavcodec  57. 34.102/57. 34.102 
     libavformat 57. 34.101/57. 34.101 
     libavdevice 57. 0.101/57. 0.101 
     libavfilter  6. 42.100/6. 42.100 
     libavresample 3. 0. 0/3. 0. 0 
     libswscale  4. 1.100/4. 1.100 
     libswresample 2. 0.101/2. 0.101 
     libpostproc 54. 0.100/54. 0.100 
    "/Volumes/Data/oliver/Video/RAW: No such file or directory 
+0

См. также http://stackoverflow.com/questions/12136948/in-bash-why-do-shell-commands-ignore-quotes-in-arguments-when-the- аргументы-это – tripleee

ответ

1

Never store a command and its arguments in a regular variable, ожидая выполнения команды просто путем расширения переменной.

Используйте массив для хранения аргументов, затем разверните массив, когда вы вызываете фактическую команду.

if [ $# -lt 3 ]; then 
    echo "missing parameters" 
    echo "Usage: script INPUT_FILENAME OUTPUT_FILENAME" 
else 
    INPUT=$1 
    OUTPUT="/Volumes/Data/oliver/Video/Encodiert/${2}" 

    args=(-i "$INPUT" -vcodec -acodec "$OUTPUT") 
    ffmpeg "${args[@]}" 
fi 

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

printf 'ffmpeg' 
printf ' %q' "${args[@]}" 
printf '\n' 

(вошедшая команда не будет выглядеть точно так, как вы ожидаете, но он может быть использована в качестве действительной командной строки для запуска той же команды. В частности, %q спецификатора стремится избежать символов в индивидуальном порядке с помощью обратного косого черты вместо того, чтобы вводить более длинные строки в котировках.)

 Смежные вопросы

  • Нет связанных вопросов^_^