使用xargs和sed重新处理avi文件

时间:2013-08-22 22:23:42

标签: bash sed find xargs

我有一堆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将是一个更好的解决方案。此外,我不想在完成后重命名所有内容。

3 个答案:

答案 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

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