我有一堆文件需要从 转换为.mp4
。.mpeg.one
我的一个朋友向我推荐了这个简单的脚本。但是它不起作用,因为文件名包含空格。
脚本如下:
for f in $(ls *.mp4); do ffmpeg -i "$f".mp4 "$f".mprg; done
答案1
在这种情况下,您不需要使用ls
。作为一般规则,请始终尝试使用 shell 内置函数和 glob 功能,而不是依赖外部程序(例如ls
),因为外部程序可能会引入丑陋的解决方法问题。
此外,您不应该“手动”将扩展名附加到输入文件名(您指定的文件名-i
)并且应该在输出文件上删除扩展名。
因此命令应该是:
for f in *.mp4; do ffmpeg -i "$f" "${f%.mp4}".mprg; done
答案2
ls
您可以使用find -print0
和来代替xargs -0
:
find -name '*.mp4' -print0 | xargs -0 -n1 ffmpeg -i '{}' '{}'.mpeg
随后进行重命名:
rename s/mp4.mpeg$/mpeg/ *.mp4.mpeg
答案3
- 不需要
ls
- 你可能是
.mpeg
指扩展 - 如果你放置
"
正确,空格就不会成为问题 ffmpeg -i "$f".mp4
在你的命令中会寻找例如 files.mp4.mp4,这可能不是你的本意- 请注意,您的输出文件将被命名为 files.mp4.mpeg
可能的解决方案:
for f in *.mp4; do ffmpeg -i "$f" "$f".mpeg; done