我想创建一个shell文件来查找文件是Unix还是Dos文件类型。使用 IF 查询,我想在检查文件是否需要使用"dos2unix"进行转换后决定。我知道命令"FILE",但返回值不是布尔数据类型,它是一个字符串。
那么,如果文件是 unix 文件类型,有没有办法将布尔位设置为 true?
提前感谢...!
您可以解析file
命令的输出。对于具有 行结尾的文本文件,它输出 ASCII text ...
,而对于具有 \r 行结尾的文本文件,它输出 ASCII text ... with CRLF line terminators
。请注意,根据实际文件内容,可以使用其他信息代替"..."。因此,您可以做类似的事情
file YOURFILE | grep -q '^ASCII text.*with CRLF'
((is_dos_text_file=1-$?))
变量 is_dos_text_file
包含值 1,如果 YOURFILE 被文件判断为带有 CRLF 结尾的文本文件。如果 YOURFILE 具有 Unix 行尾,或者未被判断为文本文件,则为 0。
更新:我刚刚注意到您在帖子中使用了shell标签,因此搜索Posix Shell解决方案。在这种情况下,不能使用 ((...))
构造,您必须执行以下操作
if file YOURFILE | grep -q '^ASCII text.*with CRLF'
then
is_dos_text_file=1 # true
else
is_dos_text_file=0 # false
fi
以获得相同的效果。
您可以将文件转换为 Unix 文件并检查它是否仍然相同。在这种情况下,它是一个Unix文件。否则它是一个DOS文件。
echo unix > unix-file
echo dos | unix2dos > dos-file
for file in {dos,unix}-file; do
if cmp -s $file <(dos2unix < $file); then
echo $file is a unix file
else
echo $file is a dos file
fi
done