Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 检查文件是否为unix文件,如果为';这是真的_Linux_Shell_Unix - Fatal编程技术网

Linux 检查文件是否为unix文件,如果为';这是真的

Linux 检查文件是否为unix文件,如果为';这是真的,linux,shell,unix,Linux,Shell,Unix,我想创建一个shell文件,查找文件是Unix还是Dos文件类型。使用IF查询,我想在检查文件是否需要使用“dos2unix”进行转换后确定。我知道命令“FILE”,但返回值不是布尔数据类型,而是字符串 那么,如果文件是unix文件类型,有没有办法将布尔位设置为true 提前谢谢 您可以解析文件命令的输出。对于具有\r\n行结尾的文本文件,它输出ASCII文本…,而对于具有\r\n行结尾的文本文件,它输出ASCII文本。。。使用CRLF线路终端。请注意,根据实际文件内容,可以使用其他信息来代替“

我想创建一个shell文件,查找文件是Unix还是Dos文件类型。使用IF查询,我想在检查文件是否需要使用“dos2unix”进行转换后确定。我知道命令“FILE”,但返回值不是布尔数据类型,而是字符串

那么,如果文件是unix文件类型,有没有办法将布尔位设置为true


提前谢谢

您可以解析
文件
命令的输出。对于具有\r\n行结尾的文本文件,它输出
ASCII文本…
,而对于具有\r\n行结尾的文本文件,它输出
ASCII文本。。。使用CRLF线路终端
。请注意,根据实际文件内容,可以使用其他信息来代替“…”。因此,您可以执行以下操作

file YOURFILE | grep -q '^ASCII text.*with CRLF'
((is_dos_text_file=1-$?))
if file YOURFILE | grep -q '^ASCII text.*with CRLF'
then
  is_dos_text_file=1 # true
else
  is_dos_text_file=0 # false
fi
如果文件判断您的文件为带有CRLF结尾的文本文件,则变量
is_dos_text_file
包含值1。如果您的文件有Unix行结尾,或者未判断为textfile,则为0

更新:我刚刚注意到您在发布中使用了shell标记,因此搜索Posix shell解决方案。在这种情况下,不能使用
(…)
构造,您必须执行以下操作

file YOURFILE | grep -q '^ASCII text.*with CRLF'
((is_dos_text_file=1-$?))
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
echo unix>unix文件
echo dos | unix2dos>dos文件
对于{dos,unix}-文件中的文件;做

如果cmp-s$文件,您可以使用
if文件${myfile}| grep-q'ASCII text';那么bool=1;else-bool=0;fi
可能可以使用
dos2unix
的选项
-ic
,请参阅
man dos2unx
引文:仅转换具有DOS换行符的文件,并保持其他文件不变:
dos2unix-ic*.txt | xargs dos2unix
dos2unix
不应更改已具有UNIX行结尾的文件,因此在所有文件上运行它不会有任何影响。非常感谢您的快速回复。我将尝试使用dos2unix-ic选项,因为在我的情况下,在所有文件上运行它并不重要。Unix可以存储所有文件类型,而不仅仅是没有CR-LF的文件类型,因此实际上没有“Unix文件”类型。也许您应该使用一个名为“DopeyWindowsThing”@PS的变量:这不起作用,因为
文件打印的描述包含所有文本文件的字符串ASCII文本,而不考虑行尾。谢谢您的详细回答。我已经根据您的示例实现了它。仅对于ascii文件,不要执行
dos2unix/bin/cp
。也不要用望远镜看太阳。