用于查找文件类型的shell脚本

时间:2014-11-17 00:56:19

标签: linux bash shell unix

我正在开发一个shell脚本,它接受一个命令行参数,一个文件路径(可能是相对的或绝对的)。该脚本应检查该文件并打印由短语组成的单行:

Windows ASCII

如果文件是带有CR / LF行终止符的ASCII文本文件,或

其他东西

如果文件是二进制或带有“Unix”LF行终止符的ASCII。

目前我有以下代码。

#!/bin/sh
file=$1
if grep -q "\r\n" $file;then
echo Windows ASCII
else
echo Something else
fi

它正确地显示信息,但是当我通过诸如/ bin / cat传递非Windows ASCII类型的东西时,它仍然将其视为Windows ASCII。当我传递.txt文件类型时,它会按预期显示其他内容,它只显示在显示Windows ASCII的文件夹上。我想我没有正确处理它,但我不确定。有关如何解决此问题的任何指示?

2 个答案:

答案 0 :(得分:1)

如您所指定,您只需要区分两种情况,这应该有效。

#!/bin/sh
file="$1"
case $(file "$file") in
  *"ASCII text, with CRLF line terminators" )
     echo "Windows ASCII"
  ;;
  * )
     echo "Something else"
  ;;
esac

正如您指定#!/bin/sh,或者如果您的目标是完全向后兼容,则可能需要更改

$(file "$file")

`file "$file"`

要将脚本与包含空格的文件名一起使用,请注意所有$变量名称现在都用双引号括起来。并且当你调用脚本时,你还必须引用文件名中的空格字符,即

 myFileTester.sh "file w space.txt"
 OR
 myFileTester.sh 'file w space.txt'
 OR
 myFileTester.sh file\ w\ space.txt
 OR

此外,如果您必须开始区分file可以分析的所有可能情况,那么您手上就会有一个相当大的案例陈述。 AND file因其返回的不同消息而臭名昭着,具体取决于/etc/file/magic,操作系统,版本等的内容。

IHTH

答案 1 :(得分:0)

使用file命令查找文件类型:

$ file /etc/passwd 
/etc/passwd: ASCII English text

$ file /bin/cat 
/bin/cat: Mach-O 64-bit executable x86_64

$ file test.txt 
test.txt: ASCII text, with CRLF line terminators