53

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

我知道我可以跑

翻转 -u
或脚本中的类似内容来转换所有内容,但我希望能够识别那些需要首先更改的文件。

4

7 回答 7

72

您可以使用该file工具,它会告诉您行尾的类型。或者,您可以使用dos2unix -Uwhich 将所有内容转换为 Unix 行结尾,而不管它以什么开头。

于 2008-09-23T14:40:41.630 回答
29

你可以使用 grep

egrep -l $'\r'\$ *
于 2008-09-23T14:42:27.587 回答
14

类似于以下内容:

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

尽管其中一些正则表达式可能需要完善和整理。

这将在每行的末尾输出带有 WIN、MAC 或 UNIX 的文件。如果您的文件在某种程度上是一个可怕的混乱(或差异)并且有混合的结局,那就太好了。

于 2010-01-14T15:24:03.480 回答
5

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

find . -type f -exec file {} \; | grep "CRLF" | awk -F ':' '{ print $1 }'
  • 用于file查找文件类型。那些有 CRLF 的有窗口返回字符。的输出file由 a 分隔:,第一个字段是文件的路径。
于 2016-06-15T21:41:40.733 回答
2

Unix 使用一个字节,0x0A(换行),而 windows 使用两个字节,0x0D 0x0A(回车,换行)。

如果您从未看到 0x0D,那么它很可能是 Unix。如果您看到 0x0D 0x0A 对,那么很可能是 MSDOS。

于 2008-09-23T14:42:11.847 回答
0

Windows 使用 char 13 和 10 作为行尾,unix 只有其中一个(我不记得是哪一个)。因此,您可以将 char 13 和 10 替换为 char 13 或 10 (使用 unix 的那个)。

于 2008-09-23T14:36:53.090 回答
0

当您知道哪些文件具有 Windows 行结尾(0x0D 0x0A\r \n)时,您将如何处理这些文件?我想,您会将它们转换为 Unix 行尾(0x0A\n)。您可以使用实用程序将具有 Windows 行尾的文件转换为 Unix 行尾sed,只需使用命令:

$> sed -i 's/\r//' my_file_with_win_line_endings.txt

您可以将其放入脚本中,如下所示:

#!/bin/bash

function travers()
{
    for file in $(ls); do
        if [ -f "${file}" ]; then
            sed -i 's/\r//' "${file}"
        elif [ -d "${file}" ]; then
            cd "${file}"
            travers
            cd ..
        fi
    done
}

travers

如果你从你的根目录运行它,最后你会确定所有文件都以 Unix 行结尾。

于 2015-05-09T09:00:39.960 回答