我制作了一个bash脚本,因为我需要将目录中的许多文件从.MOV转换为.mp4格式。 我为此创建了此脚本:
E
该脚本应该将我每个.MOV文件转换为$ 1指示的目录,但是它不起作用,它仅转换我一个文件,然后终止。我不明白为什么。怎么了?
答案 0 :(得分:2)
最好使用glob循环:
for file in "$1"/*.MOV; do
ffmpeg -i "$file" ... "${file%.*}.mp4"
done
答案 1 :(得分:2)
使用 GNU Parallel 并行地快速,简洁地完成所有操作,如下所示:
parallel --dry-run ffmpeg -i {} -vcodec copy -acodec copy {.}.mp4 ::: movies/*MOV
示例输出
ffmpeg -i movies/a.MOV -vcodec copy -acodec copy movies/a.mp4
ffmpeg -i movies/b.MOV -vcodec copy -acodec copy movies/b.mp4
如果看起来不错,请重做一次,但不要使用--dry-run
。
请注意 GNU Parallel 为您轻松处理所有循环,所有引用和更改扩展名。
答案 2 :(得分:1)
您的代码对我有用。我看不到任何错误。但我可以建议您采用更好的方法。不要使用ls
来获取文件名,这不是一个好主意。另外,您可以避免更改目录。
#!/bin/bash
for line in $(find "$1" -maxdepth 1 -type f -iname "*.mov")
do
ffmpeg -i "$line" -vcodec copy -acodec copy "${line%????}.mp4"
done
您无需先触摸文件即可。无论如何,您根本不需要文件,可以使用for
循环来遍历find直接返回的文件。使用find
,我已经选择了指定文件夹中所有具有预期扩展名的文件。
在这里,我添加了一个单线,应该避免空格问题:
find "$1" -maxdepth 1 -type f -iname "*.mov" -print0 | xargs -0 -n 1 -I{} bash -c "F={}; ffmpeg -i \"\$F\" -vcodec copy -acodec copy \"\${F%.*}\".mp4"