从Shell脚本运行FFmpeg

Abs*_*Abs 0 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
Run Code Online (Sandbox Code Playgroud)

这是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
Run Code Online (Sandbox Code Playgroud)

Roa*_*ter 5

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

find /path/ -type f -name "*wav" -exec ffmpeg -i {} -sameq {}.mp3 \;
Run Code Online (Sandbox Code Playgroud)

如果要查找"rm"文件,并在转换后删除它们:

find /path/ -type f -name "*.rm" -exec ffmpeg -i {} -sameq {}.mp3 && rm {} \;
Run Code Online (Sandbox Code Playgroud)

也就是说,如果你想用你展示的shell脚本来做,那就走吧

echo "$i";
Run Code Online (Sandbox Code Playgroud)

用这个替换它:

ffmpeg -i "$i" -sameq "$i".mp3
Run Code Online (Sandbox Code Playgroud)

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

for i in *
Run Code Online (Sandbox Code Playgroud)

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

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

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