gpt4 book ai didi

linux - Bash 脚本找不到文件

转载 作者:太空宇宙 更新时间:2023-11-04 12:20:37 24 4
gpt4 key购买 nike

我正在编写一个简单的脚本来遍历文件夹中的所有 m4a 文件并将它们编码为 mp3。我想在不同的线程中对文件进行编码以提高执行速度并利用我 PC 中的所有内核,所以我将任务发送到后台,如果这是正确的方法请告诉我。不管怎样,对于我想要编码的每个文件,我都收到了一个No such file or 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"

最佳答案

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

更微妙的是,您还需要 encode 在返回之前恢复原始工作目录,这样递归调用就不会在遍历当前目录时“意外地”更改工作目录。 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
}

关于linux - Bash 脚本找不到文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46132273/

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