我有一堆(数百个)应该有 Unix 行结尾的文件。我强烈怀疑其中一些有 Windows 行尾,我想以编程方式找出哪些行尾。
我知道我可以跑
翻转 -u或脚本中的类似内容来转换所有内容,但我希望能够识别那些需要首先更改的文件。
我有一堆(数百个)应该有 Unix 行结尾的文件。我强烈怀疑其中一些有 Windows 行尾,我想以编程方式找出哪些行尾。
我知道我可以跑
翻转 -u或脚本中的类似内容来转换所有内容,但我希望能够识别那些需要首先更改的文件。
您可以使用该file
工具,它会告诉您行尾的类型。或者,您可以使用dos2unix -U
which 将所有内容转换为 Unix 行结尾,而不管它以什么开头。
你可以使用 grep
egrep -l $'\r'\$ *
类似于以下内容:
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
由 a 分隔:
,第一个字段是文件的路径。Unix 使用一个字节,0x0A(换行),而 windows 使用两个字节,0x0D 0x0A(回车,换行)。
如果您从未看到 0x0D,那么它很可能是 Unix。如果您看到 0x0D 0x0A 对,那么很可能是 MSDOS。
Windows 使用 char 13 和 10 作为行尾,unix 只有其中一个(我不记得是哪一个)。因此,您可以将 char 13 和 10 替换为 char 13 或 10 (使用 unix 的那个)。
当您知道哪些文件具有 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 行结尾。