我有一堆(数百个)应该有Unix行结尾的文件。我强烈怀疑其中一些有Windows行结尾,我想以编程方式找出哪些内容。
我知道我可以在脚本中运行
flip -u或类似内容来转换所有内容,但我希望能够识别那些需要先更改的文件。
答案 0 :(得分:68)
您可以使用file
工具,它会告诉您行结尾的类型。或者,您可以使用dos2unix -U
将所有内容转换为Unix行结尾,无论其开头是什么。
答案 1 :(得分:28)
你可以使用grep
egrep -l $'\r'\$ *
答案 2 :(得分:14)
有些事情:
perl -p -e 's[\r\n][WIN\n]; s[(?<!WIN)\n][UNIX\n]; s[\r][MAC\n];' FILENAME
虽然有些正则表达式可能需要改进和整理。
这将在每行末尾用WIN,MAC或UNIX输出您的文件。好的,如果你的档案是某种可怕的混乱(或差异)并且有混合的结局。
答案 3 :(得分:4)
这是最安全的答案。 Stimms答案不考虑子目录和二进制文件
find . -type f -exec file {} \; | grep "CRLF" | awk -F ':' '{ print $1 }'
file
查找文件类型。那些有CRLF的人有窗口返回字符。 file
的输出由:
分隔,第一个字段是文件的路径。答案 4 :(得分:3)
Unix使用一个字节0x0A(LineFeed),而Windows使用两个字节,0x0D 0x0A(回车,换行)。
如果你从未见过0x0D,那很可能就是Unix。如果你看到0x0D 0x0A对那么它很可能是MSDOS。
答案 5 :(得分:0)
Windows使用char 13&amp; 10为行结束,unix只有其中一个(我不记得哪一个)。所以你可以取代char 13&amp; 10为char 13或10(使用unix的那个)。
答案 6 :(得分:0)
当您知道哪些文件包含Windows行结尾(0x0D 0x0A
或\r \n
)时,您将对该文件执行哪些操作?我习惯,你会将它们转换成Unix行结束(0x0A
或\n
)。您可以使用sed
实用程序将带有Windows行结尾的文件转换为Unix行结尾,只需使用命令:
$> 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
如果你从你的root目录用文件运行它,最后你将确保所有文件都是Unix行结尾。