我有一堆AVI,我想重新加工成h264 MKV。我正在尝试使用的命令是:
find . -name "*.avi" | xargs -I '{}' ffmpeg -i {} -vcodec libx264 `echo {} | sed 's/avi/mkv/'`
但是,它没有按预期工作。添加-t到xargs表明正在运行的命令是(给定一个带有file1.avi的目录)
ffmpeg ./file1.avi -vcodec libx264 ./file1.avi
我不确定为什么没有正确处理sed命令。 ffmpeg失败,因为它默认情况下不会覆盖。
AVI都在子目录中,因此我真的不想为每个子文件夹执行for循环,并且查找/ xargs将是一个更好的解决方案。此外,我不想在完成后重命名所有内容。
答案 0 :(得分:2)
这不起作用的原因是` `
之间的所有内容都在执行xargs
之前执行。但是如果你在' '
中引用它,那么它将被正确传递,但xargs
不会解析或扩展它。
但你可以管道到bash函数!
convertFile() {
while read -r filename; do
newFilename="${filename:0:-3}mkv"
ffmpeg "$filename" -vcodec libx264 "$newFilename"
done
}
find . -name "*.avi" | convertFile
请注意,我使用bash字符串操作代替sed
。原因是您的文件有时可能包含 avi 字词,例如 gr avi ty 。这就是使用更多防故障方式的原因。
答案 1 :(得分:1)
find *.avi | while read f; do
ffmpeg "$f" -vcodec libx264 "${f%.avi}.mkv"
done
我将这些线条分开以免吓唬人,但在现实生活中它会是
find *.avi|while read f;do ffmpeg "$f" -vcodec libx264 "${f%.avi}.mkv"; done
因为这是一线领域。
答案 2 :(得分:0)
您可以改用以下命令:
find *.avi | awk '{print "\""$0"\"", "-vodec libx264","\""$0"\""}' | sed 's/\(.*\)avi\"$/\1mkv\"/g' | xargs ffmpeg -i
当然这有很多转义字符。它不是一个脚本,它是一个命令行......