从Shell脚本运行FFmpeg

时间:2010-06-02 18:25:23

标签: linux shell ffmpeg

我找到了一个有用的shell脚本,以递归方式显示目录中的所有文件。

它打印文件名echo "$i"; #Display File name

我想在非MP3文件上运行ffmpeg命令,我该怎么做?我对shell脚本的知识非常有限,所以如果我被勺子喂食,我会很感激! :)

//if file is NOT MP3

ffmpeg -i [the_file] -sameq [same_file_name_with_mp3_extension]

//delete old file

这是shell脚本供参考。

DIR="."

function list_files()
{
    if !(test -d "$1")  
    then echo $1; return;
    fi

    cd "$1"
    echo; echo `pwd`:; #Display Directory name

    for i in *
    do
               if test -d "$i"  #if dictionary
                then  
                          list_files "$i" #recursively list files
                  cd ..
                else
            echo "$i"; #Display File name
                fi

    done
}

if [ $# -eq 0 ]
then list_files .
exit 0
fi

for i in $*
do
    DIR="$1"
    list_files "$DIR"
    shift 1 #To read next directory/file name
done

2 个答案:

答案 0 :(得分:5)

您可以使用查找单行做同样的事情。假设您要处理的文件都是wav:

find /path/ -type f -name "*wav" -exec ffmpeg -i {} -sameq {}.mp3 \;

如果您想查找“rm”文件,请在转换后删除它们:

find /path/ -type f -name "*.rm" -exec ffmpeg -i {} -sameq {}.mp3 && rm {} \;

也就是说,如果您想使用您显示的shell脚本来执行此操作,请使用

echo "$i";

替换为:

ffmpeg -i "$i" -sameq "$i".mp3

$ i是一个变量。几行,你有:

for i in *

这基本上意味着“对于*中的每个元素(反过来代表当前目录中的所有文件,它就是所谓的”shell扩展“),将元素/文件的名称放在变量 i中,然后执行“do”和“done”之间的所有代码。因此,对于每次迭代, i 将包含此目录中其中一个文件的名称。

还有一个部分测试 i 是否是一个目录,如果是,它会递归列出其内容。

快速最后的说明:\;在find命令的末尾是重要的,它需要在反斜杠之前有一个空格,否则它将无法工作。

答案 1 :(得分:0)

您的shell脚本似乎基本上是ls -1R,因此使用它可能更容易。至于在非MP3文件上运行ffmpeg,使用find而不是编写整个shell脚本可能更容易。假设您通过扩展程序识别MP3文件:

find your-path -not -name "*.mp3" -exec ffmpeg -i '{}' -sameq '{}.mp3' \;