2017-09-09 84 views
0

我正在编写一个简单的脚本来遍历文件夹中的所有m4a文件,并将它们编码为mp3。我想在不同线程中对文件进行编码,以提高执行速度并充分利用PC中的所有内核,因此我将任务发送到后台,如果这是正确的方法,请告知我。 无论如何,我得到一个没有这样的文件或直接错误的每一个我想要编码的文件,即使该文件存在;有趣的是,如果我将完全相同的指令复制到终端,它将被正确执行。你能帮我找出我做错了什么吗?Bash脚本未找到文件

在此先感谢。

#!/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

你有太多的报价。 – chepner

回答

0

您提到的问题是您将文字引号添加到文件的名称; "$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 
} 
+0

非常感谢,这很有魅力。只需将“转换后的”目录添加到编码路径中,以便将其存储在新创建的文件夹中。 – user2751809