Linux 查找文件类型的shell脚本

Linux 查找文件类型的shell脚本,linux,bash,shell,unix,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 e

我正在编写一个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类型的内容时,它的id仍然是Windows ASCII。当我传递一个.txt文件类型时,它会像预期的那样显示其他内容,它只是在文件夹上显示Windows ASCII。我想我处理得不好,但我不确定。有关如何解决此问题的任何提示?

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

$ 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

当您指定只需要区分两种情况时,这应该是可行的

#!/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")

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

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

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


IHTH

二进制文件也可以包含\r\n。如果我尝试此测试,如果测试-f“$file”,则回显“$file:windows ASCII”,否则回显“$file:Bianary”fi,则无论我通过的是哪种文件类型,结果都是ASCII。我在这里遗漏了什么吗?实际上,当我尝试传递ASCII文件类型时。例如,dat会将其显示为其他内容,但如果我在脚本之外传递文件,它会说它是ASCII类型。这就是我所提到的
/etc/file/magic
消息。您必须使用CRLF行终止符“
将case语句从
*”ASCII文本编辑为
*“从文件中返回的任何消息”
。我希望这是清楚的。如果没有,请用注释回复,说明文件yourWindowsAscifile.txt的确切输出。一旦拼写正确,该文件就可以正常工作。顺便问一下,我如何处理名称中有空格的情况?请参阅我的编辑。基本上,对$1和$file的所有引用现在都是
“$1
“$file”
,在命令行上调用时必须引用文件名。祝你好运。
 myFileTester.sh "file w space.txt"
 OR
 myFileTester.sh 'file w space.txt'
 OR
 myFileTester.sh file\ w\ space.txt
 OR