2014-09-30 2 views
1

Я пытаюсь создать простой скрипт bash для команды, поэтому я могу сделать его многоразовым для меня, команда была взята из другого сообщения, чтобы конвертировать видео с помощью ffmpeg, а затем загрузить.Parsing Values ​​To Shell Bash Script

Вот что у меня есть.

#!/bin/bash 
MOVIES=$1 
EXT=$2 
BUCKET=$3 
find "$MOVIES" -name "*.$EXT" -exec sh -c 'ffmpeg -i "$0" -c:v libx264 -crf 22 -c:a libfaac -movflags faststart "${0%%.mov}.mp4" && s3cmd put "${0%%.mov}.mp4" "$BUCKET""$(basename "${0%%.mov}.mp4")"' {} \; 
exit; 

У меня возникают проблемы с третьим var, если я запускаю его так.

sh batch.sh ~/Documents/screengrabs/ mov s3://bucket/ 

Я получаю сообщение об ошибке, которое он кодирует правильно.

ERROR: Parameter problem: Destination must be S3Uri. Got: file://49A22352-9F41-48B9-BF97-610CBF699025-630-0000055828D0D55F.mp4 

Это означает, что он не разбирает параметр $ 3 $ BUCKET должным образом.

Любая помощь - это моя первая попытка сценария bash.

Благодаря

Обновление до сих пор не работает

#!/bin/bash 
MOVIES="$1" 
EXT="$2" 
BUCKET="$3" 

find "$MOVIES" -name "*.${EXT}" -exec sh -c 'ffmpeg -i "$0" -c:v libx264 -crf 22 -c:a libfaac -movflags faststart "${0%%.mov}.mp4" && s3cmd put "${0%%.mov}.mp4" "${BUCKET}/sam.mp4"' {} \; 

exit; 

РАБОТА

#!/bin/bash 
MOVIES=$1 
EXT=$2 
export BUCKET=$3 
find "$MOVIES" -name "*.$EXT" -exec sh -c 'ffmpeg -i "$0" -c:v libx264 -crf 22 -c:a libfaac -movflags faststart "${0%%.mov}.mp4" && s3cmd put "${0%%.mov}.mp4" "$BUCKET""$(basename "${0%%.mov}.mp4")"' {} \; 
exit; 
+0

Я думаю, что использование переменных MOVIES, EXT, BUCKET типа «*. $ {EXT}», «$ {BUCKET}» будет работать вместо $ BUCKET, $ EXT. –

+0

ok спасибо, плохой дайте это;) – user1503606

+0

По-прежнему не повезло, если я жесткий код s3: // bucket/вместо этого в опции $ {BUCKET} он работает – user1503606

ответ

1

Проблема заключается в том, что $0 это имя сценария, который выполняется (в этом случае временный файл, созданный sh от аргумента до -c), а не первый аргумент nt к результирующему сценарию. Обратите внимание, что в сообщении об ошибке не упоминается файл с именем sam, поэтому он генерируется аргументом ${0%%.mov}.mp4 в s3cmd, а не том, который использует $BUCKET. Замените его на $1. Кроме того, вам необходимо экспортировать BUCKET так, чтобы оболочка, начатая find, имела к ней доступ. (Символьная строка $BUCKET, а не его значение, передаются sh через его -c варианта, потому что строка справедливо одинарная кавычки.)

(ДОПОЛНЕНО, как Этан отметил, $0 является правильным.)

#!/bin/bash 
MOVIES=$1 
EXT=$2 
export BUCKET=$3 
find "$MOVIES" -name "*.$EXT" -exec sh -c 'ffmpeg -i "$0" -c:v libx264 -crf 22 -c:a libfaac -movflags faststart "${1%%.mov}.mp4" && s3cmd put "${0%%.mov}.mp4" "$BUCKET""$(basename "${0%%.mov}.mp4")"' {} \; 
exit; 

bash в 4, однако, я бы просто написать

#!/bin/bash 
MOVIES=$1 
EXT=$2 
BUCKET=$3 

shopt -s globstar 
for movie in "$MOVIES"/**/*."$EXT"; do 
    mp4movie=${movie%%.mov}.mp4 
    ffmpeg -i "$movie" -c:v libx264 -crf 22 -c:a libfaac -movflags faststart "$mp4movie" && 
     s3cmd put "$mp4movie" "$BUCKET/$mp4movie" 
done 

Это намного проще, чтобы получить права, чем пытаться втиснуть небольшой скрипт в одну строку для sh -c.


Руководство рекурсивный поиск с bash 3.2:

process_file() { 
    movie=$1 
    mp4movie=${movie%%.mov}.mp4 
    ffmpeg -i "$movie" -c:v libx264 -crf 22 -c:a libfaac -movflags faststart "$mp4movie" && 
     s3cmd put "$mp4movie" "$BUCKET/$mp4movie" 
} 

process_directory() { 
    dir=$1 
    for name in "$dir"/*; do 
     if [[ -d "$name" ]]; then 
      process_directory "$name" 
     elif [[ -f $name && $name = *.$EXT ]]; then 
      process_file "$name" 
     fi 
    done 
} 

MOVIES=$1 
EXT=$2 
BUCKET=$3 
process_directory "$MOVIES" 
+0

Спасибо, Чепнер попытался заставить это работать, но я просто получаю эту ошибку /Users/user/Documents/screengrabs//**/*.mov: Нет такого файла или каталога, извините, что я не знаю о сценариях bash, которые будут теперь наблюдайте некоторые уроки – user1503606

+0

При использовании '-c' первый аргумент без аргумента в' sh' устанавливается в '$ 0'. При обычном использовании это имя скрипта, но не с явным набором аргументов без параметров сценария 'sh -c 'echo" \ $ 0: $ 0 = $ @ "' foo bar baz' выходы' $ 0: foo = bar baz'. –

+0

Спасибо, Etan. Я должен был дважды проверить это. Я бы отредактировал свой ответ, но в свете нечетного 'file:' URL-адреса, я не уверен, что делать, чтобы сделать. – chepner

0

@ ответ chepner в об использовании "родной" скрипт хороший один. При этом, и, как я только что опубликовал в комментарии к OP, я считаю, что проблема здесь - просто проблема с переменной областью.

При редактировании сценария использовать "$1" вместо "$BUCKET" в сценарии, переданного sh -c и добавить "$BUCKET" между {} и \; Я считаю, что сценарий будет работать (хотя я не в полной мере оценили сценарий в других отношениях).