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尝试查找文件是可靠的.
不确定你的意思是"不可靠",但你可能想尝试:
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)
并自己检查行结尾.