如何在linux文件系统中找到dos格式文件

den*_*zer 12 linux vim shell find

我想找出目录中的哪些文件是dos文本文件(而不是unix文本文件).

我尝试过的:

find . -name "*.php" | xargs grep ^M -l
Run Code Online (Sandbox Code Playgroud)

它没有给我可靠的结果......所以我正在寻找一个更好的选择.

有什么建议,想法?

谢谢

澄清

除了我上面所说的,问题是我有一堆dos文件,其中没有^ M字符(因此我关于可靠性的说明).

我目前确定文件是否为dos的方式是通过Vim,其底部是:

"filename.php" [dos] [noeol]
Run Code Online (Sandbox Code Playgroud)

bvp*_*vpb 14

怎么样:

find . -name "*.php" | xargs file | grep "CRLF"
Run Code Online (Sandbox Code Playgroud)

我不认为尝试使用^M尝试查找文件是可靠的.


pax*_*blo 9

不确定你的意思是"不可靠",但你可能想尝试:

find . -name '*.php' -print0 | xargs -0 grep -l '^M$'
Run Code Online (Sandbox Code Playgroud)

这使用了更加恶劣的文件名和空格友好的选项,只能在行尾之前找到回车符.

请记住,这^M是一个单个CTRLM字符,而不是两个字符.

而且,它会列出文件,甚至一个线在DOS模式下,这可能是你想要什么呢,因为那些本来由非UNIX编辑错位UNIX文件.


根据您的更新,vim将您的文件报告为DOS格式:

如果vim 将其报告为DOS格式,则行都以CRLF.这就是vim的工作方式.如果连一个行没有CR,那么它被认为是UNIX格式和^M字符在缓冲区可见.如果它是所有DOS格式,^M则不显示字符:

Vim会查找dos和unix行结尾,但Vim内置了unix格式的首选项.

- 如果文件中的所有行都以CRLF结尾,则将应用dos文件格式,这意味着在将行读入缓冲区时删除每个CRLF,缓冲区'ff'选项将为dos.
- 如果一行或多行仅以LF结尾,则将应用unix文件格式,这意味着每个LF都被删除(但每个CR将出现在缓冲区中,并将显示为^ M),缓冲区'ff'选项将是unix.

如果你真的想知道文件中有什么,不要依赖像vim这样太智能的工具:-)

使用:

od -xcb input_file_name | less
Run Code Online (Sandbox Code Playgroud)

并自己检查行结尾.