如何确定文件的行结尾

nwa*_*aet 51 scripting line-endings

我有一堆(数百个)应该有Unix行结尾的文件.我强烈怀疑其中一些有Windows行结尾,我想以编程方式找出哪些行.

我知道我可以跑了

flip -u
或者在脚本中类似的东西来转换所有东西,但我希望能够识别那些需要先改变的文件.

Ada*_*eld 69

您可以使用该file工具,它将告诉您行结束的类型.或者,您可以使用dos2unix -U哪个将所有内容转换为Unix行结尾,无论它是从什么开始.

  • @Fedir:是的,它只是,如果文件有常规的LF行结尾,那么它将不会打印任何输出.但是如果文件有CRLF,裸CR或混合行结尾,它会告诉你. (8认同)
  • 文件不显示行结尾.防爆.:"file .bashrc => .bashrc:ASCII英文文本"需要一些额外的密钥? (5认同)
  • 这适用于某些文件类型,但不适用于其 在Linux上,它不会报告html文件的行结尾. (3认同)
  • 在OS X上的CRLF专用Perl脚本上没有用.我可能是GNU扩展吗? (2认同)

sti*_*mms 28

你可以使用grep

egrep -l $'\r'\$ *
Run Code Online (Sandbox Code Playgroud)

  • 它只是在Ubuntu上为我列出了文件夹中的所有文件. (7认同)
  • 出于某种原因,当我在MacOS X shell中运行此命令时,我得到了目录中所有文件的列表.即使是我用"echo"测试"> torderform6.cpp"新生成的一个.知道可能出了什么问题吗? (3认同)
  • 此命令仍将列出已在其上运行dos2unix的文件. (2认同)
  • 试试`$'\ r'\ $`. (2认同)

joa*_*him 14

有点像:

perl -p -e 's[\r\n][WIN\n]; s[(?<!WIN)\n][UNIX\n]; s[\r][MAC\n];' FILENAME
Run Code Online (Sandbox Code Playgroud)

虽然一些regexp可能需要精炼和整理.

这将在每行结尾处输出带有WIN,MAC或UNIX的文件.好,如果你的文件是某种可怕的混乱(或差异),并具有混合的结尾.


Bry*_*nta 5

这是最安全的答案。Stimms 答案不考虑子目录和二进制文件

find . -type f -exec file {} \; | grep "CRLF" | awk -F ':' '{ print $1 }'
Run Code Online (Sandbox Code Playgroud)
  • 使用file查找文件类型。带有 CRLF 的那些有 Windows 返回字符。的输出file由 a 分隔:,第一个字段是文件的路径。

  • 大多数故障安全不是 - `file` 甚至不总是在其输出中告诉“CRLF”,这取决于它是什么类型的文件。我发现对于 SVG 文件——包含很像纯文本文件的文本——`file` 没有提到使用的行尾类型。因此,此脚本与文件类型无关。就是说。否则看起来像一个理智的单线,上述限制不可承受。 (3认同)