2016-07-22 20 views
0

Ich versuche, ein einfaches Transcodierungsskript für VHS-Backups mit ffmpeg zu schreiben. Aber ich kann nicht mit Leerzeichen in Dateinamen umgehen.Leerzeichen im Dateinamen für ffmpeg in bash

Ich baue meinen ffmpeg-Befehl zusammen im Skript und echo es und wenn ich kopiere den Befehl echoed es funktioniert, aber nicht direkt aus dem Skript.

Hat jemand eine Idee, was ist falsch mit meinem Skript?

Script:

#!/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 

Script Aufruf:

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

Command Ausgang

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

Siehe auch http://stackoverflow.com/questions/12136948/in-bash-why-do-shell-commands-ignore-quotes-in-arguments-when-the- Argumente-sind – tripleee

Antwort

1

Never store a command and its arguments in a regular variable, erwartet, dass der Befehl einfach ausgeführt wird, indem die Variable erweitert wird.

Verwenden Sie ein Array zum Speichern der Argumente, und erweitern Sie das Array, wenn Sie den eigentlichen Befehl aufrufen.

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 

Sie benötigen ein wenig mehr Arbeit zu tun, den Befehl ordnungsgemäß anzumelden, aber das ist ein kleiner Preis für einen sicheren, richtigen Code zu zahlen.

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

(Der protokollierte Befehl wird nicht genau so aussehen wie Sie erwarten, aber es kann als eine gültige Befehlszeile verwendet werden, um den gleichen Befehl auszuführen. Insbesondere die %q Spezifizierer neigen Zeichen einzeln mit einem Backslash zu entkommen anstatt längere Strings in Anführungszeichen zu setzen.)