同じフォルダにある同じ名前の複数のファイル(.aifと.mp4)を[original_name]_new.mp4という新しいフォルダにマージするスクリプトが必要です。
パスワード:
#!/usr/bin/env bash -e
function combine(){
ffmpeg -i "$1" -i "$2" -map 0:0 -map 1:0 -acodec libfdk_aac -b:a 192k -vcodec copy -shortest "$3"
}
for video in ‘“*.mp4’; do
name="{video%.*}
audio=${name}.aif
output=${name}_new.mp4
combine $audio $video $output
done
私が得た結果は次のとおりです。
Last login: Sun Oct 18 20:31:10 on ttys000
Tjalles-Mac-Pro:~ tjallo$ /Users/tjallo/Desktop/Christof/try1\ copy.command ; exit;
/Users/tjallo/Desktop/Christof/try1 copy.command: line 8: unexpected EOF while looking for matching `"'
logout
[処理完了]
(2015年10月18日再修正)
@derobert 編集: 今私のコードは次のようになります。
set -x
#!/usr/bin/env bash
set -e
function combine(){
ffmpeg -i "$1" -i "$2" -map 0:0 -map 1:0 -acodec libfdk_aac -b:a 192k -vcodec copy -shortest "$3"
}
for video in *.mp4; do
name=“${video%.*}”
audio=“${name}.aif”
output=“${name}_new.mp4”
combine "$audio" "$video" "$output"
done
出力は次のとおりです。
Last login: Sun Oct 18 21:13:27 on ttys001
Tjalles-Mac-Pro:~ tjallo$ /Users/tjallo/Desktop/Christof/try1\ copy.command ; exit;
++ set -e
++ for video in '*.mp4'
++ name='“*”'
++ audio='““*”.aif”'
++ output='““*”_new.mp4”'
++ combine '““*”.aif”' '*.mp4' '““*”_new.mp4”'
++ ffmpeg -i '““*”.aif”' -i '*.mp4' -map 0:0 -map 1:0 -acodec libfdk_aac -b:a 192k -vcodec copy -shortest '““*”_new.mp4”'
ffmpeg version 2.8 Copyright (c) 2000-2015 the FFmpeg developers
built with Apple LLVM version 6.1.0 (clang-602.0.53) (based on LLVM 3.6.0svn)
configuration: --prefix=/usr/local/Cellar/ffmpeg/2.8 --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-libvo-aacenc --enable-libxvid --enable-vda
libavutil 54. 31.100 / 54. 31.100
libavcodec 56. 60.100 / 56. 60.100
libavformat 56. 40.101 / 56. 40.101
libavdevice 56. 4.100 / 56. 4.100
libavfilter 5. 40.101 / 5. 40.101
libavresample 2. 1. 0 / 2. 1. 0
libswscale 3. 1.101 / 3. 1.101
libswresample 1. 2.101 / 1. 2.101
libpostproc 53. 3.100 / 53. 3.100
““*”.aif”: No such file or directory
logout
[Process completed]
答え1
スクリプトにはいくつかの問題があります。
コメントで指摘したように:
#!/usr/bin/env bash -e
-e
オプションが実際にbashに渡されない場合があります。代わりに、set -e
必要に応じて行の下に配置してください。
次:
for video in ‘“*.mp4’; do
まず、「直線引用符」と「ではなく、丸い引用符」、「、」です。使用するフォントによっては区別が難しい場合があります。シェルいつも直線引用符を使用してください。第二に、*.mp4
絶対引用しないでください。引用符は拡張を防ぎ、ディレクトリ内のすべてのファイル*.mp4
に拡張しようとします。.mp4
次の行にもエラーがあります。これはシェルが文句を言うものです:
name="{video%.*}
そこに近い引用を逃した。
エラーメッセージを読み取る方法がわかったら、シェルはそれを知らせます。まず行番号を付ける必要があります。行番号を表示したり、番号別に行に移動したりするためのオプションをエディタで見つけることをお勧めします。便宜上、下に入れておきました。
1 #!/usr/bin/env bash -e
2
3 function combine(){
4 ffmpeg -i "$1" -i "$2" -map 0:0 -map 1:0 -acodec libfdk_aac -b:a 192k -vcodec copy -shortest "$3"
5 }
6
7 for video in ‘“*.mp4’; do
8 name="{video%.*}
9 audio=${name}.aif
10 output=${name}_new.mp4
11 combine $audio $video $output
12 done
このメッセージを理解する鍵は、「EOF」が「ファイルの終わり」を意味することを知っていることです。したがって、デフォルトでは、シェルは"
8行目でaを見つけました。 (引用符を終了するために)一致を探し続けますが、一致を見つけるのではなく"
ファイルの終わりを探します。
まだ質問があります:
combine $audio $video $output
ここでは、これらのファイル名を渡したいと思います。いいえ追加の拡張または単語の分離(そうしないと、スペースを含むファイル名は失敗します)。したがって、以下を引用する必要がありますcombine "$audio" "$video" "$output"
。
最後に、デバッグする必要がある最後の問題が1つあります。set -x
一番上のものを追加することです。これにより、実行中のコマンドが最初にエコーされ、何が起こっているかを確認できます。
添付:あなたの姿を見ると元の質問コード、そのような問題はあまりありません。したがって、すべての混乱。
どこでもカール引用符
編集者に二重引用符の挿入を中止するように指示する必要があります。