我有一大堆(百)的文件,都应该有Unix行的结局。我强烈怀疑他们中的一些有窗户线路的结局,并且我想要编程方式找出哪些做的。

我知道我只可以运行

flip -u
或者类似的东西在一个脚本来转换一切,但我希望能够确定这些文件需要改变第一个。

有帮助吗?

解决方案

你可以使用grep

egrep -l \r'\$ *

其他提示

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

有些事情:

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

虽然有些正则表达式可能需要改进和整理。

这将在每行末尾用WIN,MAC或UNIX输出您的文件。好的,如果你的档案是某种可怕的混乱(或差异)并且有混合的结局。

这里是最故障安全的答案。Stimms答案不账户的子目录和二进制文件

find . -type f -exec file {} \; | grep "CRLF" | awk -F ':' '{ print $1 }'
  • 使用 file 找到的文件类型。那些CRLF有窗户返回的人物。输出 file 是分隔的一个 :, 和第一场的道路的文件。

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

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

Windows使用char 13&amp; 10为行结束,unix只有其中一个(我不记得哪一个)。所以你可以取代char 13&amp; 10为char 13或10(使用unix的那个)。

当您知道哪些文件有Windows行结尾( 0x0D 0x0A \ r \ n )时,您将对该文件执行什么操作?我习惯,你将它们转换成Unix行结束( 0x0A \ n )。您可以使用 sed 实用程序将带有Windows行结尾的文件转换为Unix行结尾,只需使用命令:

#!/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
gt; sed -i 's/\r//' my_file_with_win_line_endings.txt

你可以把它放到这样的脚本中:

<*>

如果你从你的root目录用文件运行它,最后你将确保所有文件都是Unix行结尾。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top