Bash脚本找不到文件

时间:2017-09-09 15:37:04

标签: linux bash shell ffmpeg

我正在编写一个简单的脚本来迭代文件夹中的所有m4a文件并将它们编码为mp3。我想在不同的线程中对文件进行编码以提高执行速度并利用我PC中的所有内核,所以我将任务发送到后台,如果这是正确的方法,请告诉我。 无论如何,我为每个要编码的文件得到 No such file或direcory 错误,即使该文件存在;而有趣的是,如果我将完全相同的指令复制到终端,它将被正确执行。你能帮我找一下我做错了吗?

提前致谢。

#!/bin/bash

function encode {
    echo "<<<<<<<<<<< encode >>>>>>>>>>>>>>>>"
    cd "$1"
    find . -mindepth 1 -maxdepth 1 | while read f
    do
        if [ -f "${f}" ]
        then
            if [ ${f: -4} == ".m4a" ]
            then
                if [ ! -d "converted" ]
                then
                    mkdir converted
                fi
                newPath="${f%m4a}mp3"
                echo "ffmpeg -i \""$f"\" -ac 2 -b:a 320k -y \""$newPath"\" </dev/null >/dev/null &"
                ffmpeg -i \""$f"\" -ac 2 -b:a 320k -y \""$newPath"\" </dev/null >/dev/null &
            fi
        elif [ -d "${f}" ]
        then
            echo "folder $f"
            encode "$f"
        fi
    done
}


encode "$1"

1 个答案:

答案 0 :(得分:0)

您提到的问题是您要在文件名中添加文字引号; "$f"足以将$f的值原样传递给ffmpeg命令。您不需要使用find来迭代目录的直接内容;只需使用带有for循环的glob(这也可以避免阻止ffmpeg从标准输入中读取)。

更微妙的是,您还需要encode才能在返回之前恢复原始工作目录,以便递归调用不会出现意外情况&#34;迭代当前目录时更改工作目录。 pushd(而不是cd)和popd使这变得简单。

encode () {
  echo "<<<<<<<<<<< encode >>>>>>>>>>>>>>>>"
  pushd "$1"
  for f in *; do
    if [ -d "$f" ]; then
      encode "$f"
    elif [[ $f = *.m4a ]]; then
      mkdir -p converted
      newPath="${f%.m4a}.mp3"
      ffmpeg -i "$f" -ac 2 -b:a 320k -y "$newPath" > /dev/null &
    fi
  done
  popd
}