bash,检测mp4文件

时间:2014-08-10 00:12:33

标签: linux bash

if [ -f *.mp4 ]; then
        for file in *.mp4; do 
                ffmpeg2theora -v 8 --nometadata  "$file"
                rm -f "$file"
        done 
fi

if [ -f *.avi ]; then
        for file in *.avi; do
                ffmpeg2theora -v 8 --nometadata  "$file"
                rm -f "$file"
        done
fi

我无法弄清楚为什么if [ -f *.mp4 ]; then没有检测到mp4文件,我使用这个方法来查找.avi,.epub,.chm和其他一些扩展,它运行得很好。我想知道是不是因为4。我也试过if [ -f *."mp4" ]; then,但它没有用。

我觉得奇怪的是for file in *.mp4; do检测到.mp4文件而if [ -f *.mp4 ]没有!

2 个答案:

答案 0 :(得分:1)

使用bash选项nullglob允许globs扩展为零元素。这样,如果没有匹配的文件,循环就不会运行:

shopt -s nullglob
for file in *.mp4; do 
    ffmpeg2theora -v 8 --nometadata  "$file" && rm -f "$file" || \
        echo Problem transcoding "$file"
done 

至于[ -f *.mp4 ],只有当只有一个匹配的文件才会正常工作,因为它会扩展为[ -f myfile.mp4 ]

如果没有匹配的文件,它可能仍然有效(没有nullglob),因为它最终检查名称中带星号的文件,希望不存在。

如果有多个文件,则会失败,因为[ -f file1.mp4 file2.mp4 file3.mp4 ]无效test语法。

答案 1 :(得分:1)

if [ -f *.mp4 ]; then

测试中没有扩展。该测试正在寻找一个名为*.mp4的文件,该文件不存在。你应该做什么:

for i in *.mp4; do
    <do something>
done

此处扩展将在当前工作目录中提供具有.mp4扩展名的所有文件。您也可以find /path/to/dir -type f -name "*.mp4"获取文件名。 (注意:这需要.mp4个文件存在于目录中。如果不是,i=*.mp4。你做得更安全:

find /path -type f -name "*.mp4" | while read i; do 
    <do whatever>
done