1

我有一堆 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 循环,而 find / xargs 将是一个更好的解决方案。此外,完成此操作后,我真的不想重命名所有内容。

4

3 回答 3

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

请注意,不是sed我使用 bash 字符串操作。原因是您的文件有时可能包含avi单词,例如gr avi ty。这就是为什么使用了更多的防故障方式。

于 2013-08-22T22:45:25.193 回答
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

因为这是单线领域。

于 2013-08-23T04:08:49.177 回答
0

您可以改用以下命令:

find *.avi | awk '{print "\""$0"\"", "-vodec libx264","\""$0"\""}'  | sed 's/\(.*\)avi\"$/\1mkv\"/g' | xargs ffmpeg -i

当然,这有很多转义字符。这不是脚本,而是命令行...

于 2013-08-22T22:48:51.030 回答