2016-03-16 32 views
2

我的脚本不给我任何输出For循环不工作的ffmpeg

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

每当我运行它,它只是马上给我回我的提示。

回答

2

因为你的测试:

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

是假的。

如果,exampe,当前目录具有这些文件:

file1.mov 
file2 
file3.txt 
file4.mov 

然后通过每次迭代如下$file变量将被设置:

  1. ./file1.mov
  2. ./file2
  3. ./file3.txt
  4. ./file4.mov

但测试的右手侧将保持为 “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];

......这两者都不是真的。

如果你想通过在当前目录中的所有传送文件循环,用这个来代替:

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

顺便说一句,你应该随时准备与在空间和其他恼人的字符的文件名称,所以这将是一个更强大一点:

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

因为它会把引号围绕文件名。

+0

谢谢你,dovetalk。一个非常有用的答案。 – Bleakley

+0

如果我希望脚本不从当前目录中读取,而是从我放置在CLI中的任何目录中读取,那么我该怎么做? – Bleakley

+0

我不确定你的意思是“在CLI中”,但是如果你想让它成为脚本的第一个参数,你只需要将'./*。mov'改为'“$ 1”/ *。mov' – dovetalk

2

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

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

然而,这是简单的只是.mov文件匹配在第一图案如图dovetalk。

+0

谢谢,chepner,以及。 – Bleakley