对于循环不工作ffmpeg

时间:2016-03-16 23:57:37

标签: bash loops

我的脚本没有给我任何输出

for file in ./*
do
    if [ "$file" = *.mov ];
    then
        ffmpeg -i $file -an -f framemd5
    fi
done

每当我运行它时,它会立即给我提示。

2 个答案:

答案 0 :(得分:2)

因为你的考试:

if [ "$file" = *.mov ];

是假的。

例如,如果当前目录包含以下文件:

file1.mov
file2
file3.txt
file4.mov

然后在每次迭代中将$file变量设置如下:

  1. ./file1.mov
  2. ./file2
  3. ./file3.txt
  4. ./file4.mov
  5. 但是测试的右侧仍然是" file1.mov file4.mov",所以每个测试都是:

    1. if [ "./file1.mov" = file1.mov file4.mov];
    2. if [ "./file2" = file1.mov file4.mov];
    3. if [ "./file3.txt" = file1.mov file4.mov];
    4. if [ "./file4.mov" = file1.mov file4.mov];
    5. ......两者都不是真的。

      如果要遍历当前目录中的所有.mov文件,请改用:

      for file in ./*.mov; do
          ffmpeg -i $file -an -f framemd5
      done
      

      顺便说一句,你应该随时准备好在名称中包含空格和其他令人讨厌的字符的文件,这样会更加健壮:

      for file in ./*.mov; do
          ffmpeg -i "$file" -an -f framemd5
      done
      

      因为它会在文件名周围加上引号。

答案 1 :(得分:2)

假设您使用bash,则需要使用[[命令进行模式匹配。

for file in ./*
do
    if [[ "$file" = *.mov ]];
    then
        ffmpeg -i "$file" -an -f framemd5
    fi
done

但是,如dovetalk所示,仅匹配第一个模式中的.mov文件更为简单。