我找到了一个有用的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
答案 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' \;