gpt4 book ai didi

bash - 关于“ls | 的奇怪行为”在 shell 脚本中使用 ffmpeg 读取时

转载 作者:行者123 更新时间:2023-12-04 22:48:06 27 4
gpt4 key购买 nike

这个问题在这里已经有了答案:





Execute "ffmpeg" command in a loop [duplicate]

(3 个回答)


3年前关闭。




我创建了一个 shell 脚本来将所有波形文件转换为 mp3 文件。我使用 Ubuntu 18.04,FFmpeg 是使用 apt 安装的,我在 bash 中运行我的脚本。

我的脚本:

#!/bin/bash

ls *.wav | while read file
do
echo $file
ffmpeg -i "$file" -codec:a libmp3lame -b:a 192k "${file%.*}.mp3"
done

目标文件如下:(包括空格字符。真实的文件名更长,但我简化了文件名。同样在这种情况下,会出现问题)
% ls *.wav
'01 A.wav' '02 A.wav' '03 A.wav'

问题是有时循环中的 $file 是空白或奇怪的文件名的一部分('echo $file' 显示),并且 ffmpeg 说'[损坏的文件名]:没有这样的文件或目录'。我确认了以下几点。
  • 当我注释掉 ffmpeg 行时,'echo' 显示了我的预期。 ($文件未损坏)
  • 当我将 ffmpeg 替换为类似“lame”的命令时,它可以工作。 ($文件未损坏)
  • 当我替换 'ls *.wav |在将文件读取到“* .wav 中的文件”时,它可以工作。 ($文件未损坏)

  • 所以,只有当我使用 'ls' 和 'ffmpeg' 的组合时,$file 才会被破坏。这是怎么回事?还是我误解了什么?

    最佳答案

    你不应该使用 ls管道文件列表,因为这种方法不适用于诸如带有空格的文件名之类的极端情况。

    最易读的方式是使用 通配符 :

    for file in *.wav
    do
    echo "$file"
    ffmpeg -i "$file" -codec:a libmp3lame -b:a 192k "${file%.*}.mp3"
    done

    查找 在这里也做得很好,但你最终会得到一些可维护性较差的代码:
    find -name *.wav -exec ffmpeg -i {} -codec:a libmp3lame -b:a 192k {}.mp3 \;
    find示例将为您提供以 .wav.mp3 结尾的文件名而不是 .mp3 ,如果你想避免这种情况,你必须从 find 调用一个 shell,允许你使用 basename或执行类似 ${file.*} 的操作(您必须首先将 find 的 {} 分配给该 shell 中的 file 之类的变量:
    find -name "*.wav" -exec sh -c "file=\"{}\" ; ffmpeg -i \"\$file\" -codec:a libmp3lame -b:a 192k \${file%.*}.mp3" \;

    关于bash - 关于“ls | 的奇怪行为”在 shell 脚本中使用 ffmpeg 读取时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53756743/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com