【问题标题】:Using xargs and sed to reprocess avi files使用 xargs 和 sed 重新处理 avi 文件
【发布时间】:2013-08-25 20:26:34
【问题描述】:

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

【问题讨论】:

    标签: bash sed find xargs


    【解决方案1】:

    这不起作用的原因是` ` 之间的所有内容都在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 字样,例如 gravity。这就是为什么使用了更多的防故障方式。

    【讨论】:

    • 虽然我喜欢一个班轮示例,但我想说我更喜欢这个。只是因为它提醒我可以在 ~/.bashrc 中为重复的任务预先定义函数。
    【解决方案2】:

    您可以改用以下命令:

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

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

    【讨论】:

    • 如果文件名为miyavi.avi,这将不起作用。这也不适用于名称中包含空格的文件。
    • 当然。通常我不放否定。票,但你的回答很危险。它可能在测试环境中工作,也许它适用于大多数文件,但总有一天它肯定会坏掉!我投票保护其他用户免受灾难。现在您已经对其进行了编辑(谢谢!)并且似乎问题已经消失了,但是现在代码太臃肿了,我无法验证它是否有效。另外,当我看到您的编辑时,我试图通过单击 UP 来否定我的反对票,但它给了您 +1 而不是 0,所以我点击了返回。我应该再次单击 -1 来否定它。现在被锁了,我什么都做不了。我还是新手
    • 我想我们必须等到那一天:-) ...我想它被锁定了,直到我编辑我的答案。我刚刚编辑...尝试重新否定。
    • 给定一个结果,这工作正常,但是返回不止一个:ffmpeg -i test1.avi -vcodec libx264 test1.mkv test2.avi -vcodec libx264 test2.mkv test3.avi -vcodec libx264 test3.mkv
    【解决方案3】:
    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
    

    因为这是单线领域。

    【讨论】:

      猜你喜欢
      • 2012-05-22
      • 1970-01-01
      • 2015-05-12
      • 1970-01-01
      • 2013-05-21
      • 1970-01-01
      • 2020-08-20
      • 2016-06-18
      相关资源
      最近更新 更多