我需要一个脚本,将同一文件夹中同名的多个文件(.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
首先,这些是弯引号 '、' 和“,而不是直引号 ' 和 "。根据您使用的字体,这可能很难分辨。Shell总是使用直引号。其次,*.mp4
根本不应该被引用。引用会阻止扩展,并且您希望*.mp4
扩展到.mp4
目录中的所有文件。
下一行也有一个错误,这就是 shell 抱怨的错误:
name="{video%.*}
你在那里错过了一个密切的报价。
一旦您知道如何阅读其错误消息,shell 就会告诉您这一点。首先,您需要对行进行编号 - 我建议在编辑器中寻找一个显示行号的选项,或者可以按编号跳转到行。为了方便起见,我将它们放在下面:
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”意味着“文件结束”。所以基本上,shell"
在第 8 行找到了 a。它一直在寻找匹配项"
(以结束引用),但它没有找到匹配项,而是找到了文件末尾。
还有一个问题:
combine $audio $video $output
在这里,您要传递这些文件名没有任何额外的扩展或分词(否则包含空格的文件名将失败)。所以你需要引用那些:combine "$audio" "$video" "$output"
。
最后,要调试最后一个问题:set -x
在顶部添加一个。这将导致正在执行的命令首先被回显,这样您就可以看到发生了什么。
附:如果你看看你的原问题代码,它没有很多这样的问题。因此所有的混乱。
到处都是弯引号
您需要让编辑器停止为您插入大引号。