我正在编写一个简单的脚本来迭代文件夹中的所有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"
答案 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
}