2012-04-25 50 views
2

我想让这个脚本测试一个作为参数传递给它的文件是ASCII文件还是zip文件,如果它是ascii echo“ascii”,如果它是一个zip文件回声“邮编”,否则回声“错误”。在shell脚本中测试文件格式

这就是我目前所面对的

filetype = file $1 
isAscii=`file $1 | grep -i "ascii"` 
isZip=`file $1 | grep -i "zip"` 

if [ $isAscii -gt "0" ] then echo "ascii"; 
else if [ $isZip -gt "0" ] then echo "zip"; 
else echo "ERROR"; 
fi 
+0

我很确定这只是检查,看看文件*是否包含*'ascii'或'zip' - 这不能保证文件类型! – 2012-04-25 21:58:03

+0

@Wayne你是什么意思? 'man file'表示它决定了文件类型。 – 2012-04-25 21:59:46

+0

@WayneWerner:不,他正在使用文件(1)程序,它查看文件内部。 – 2012-04-25 22:00:36

回答

2

对于file命令,请尝试-b --mime-type。这里是一个过滤MIME类型的例子:

#!/bin/sh 
type file || exit 1 
for f; do 
    case $(file -b --mime-type "$f") in 
     text/plain) 
      printf "$f is ascii\n" 
      ;; 
     application/zip) 
      printf "$f is zip\n" 
      ;; 
     *) 
      printf "ERROR\n" 
      ;; 
    esac 
done 
3

正在运行的文件/ grep的命令,并检查他们的返回码的方式是不正确的。你需要做这样的事情:

if file "$1" | grep -i ascii; then 
    echo ascii 
fi 

之前,你拍摄的文件/ grep的管道进入该变量的文本输出,然后将其作为一个字符串数0比较。以上将使用命令的实际返回值,这正是您所需要的。

+0

为了使grep的输出不会与预期的输出混淆,你应该把它发送到/ dev/null:'if file“$ 1”| grep -i ascii>/dev/null;然后' – 2012-04-25 22:10:40

+1

@RSamuelKlatchko:当然,甚至更好,使用grep --quiet。 – 2012-04-25 22:11:40

+0

非常感谢你解决它:) – josephino 2012-04-25 22:20:40