以下情况:

我正在一台运行OS X的Mac上工作,最近加入了一个项目,到目前为止,该项目的成员都使用Windows。我的首要任务之一是在Git存储库中设置代码库,因此我从FTP中提取目录树,并尝试将其检入到我在本地准备的Git回购中。当我试着这么做的时候,我得到的只有这个

fatal: CRLF would be replaced by LF in blog/license.txt.

由于这将影响“blog”文件夹下面的所有文件,我正在寻找一种方法来方便地将树中的所有文件转换为Unix行结束符。是否有工具可以开箱即用,或者我自己编写脚本?

作为参考,我的Git配置关于行结束:

core.safecrlf=true
core.autocrlf=input

当前回答

从2011年开始,目前公认的答案涉及到在dos2unix中使用find -exec,但现在这是不必要的,因为包括Bash在内的绝大多数shell都支持使用通配符来操作目录中的所有文件(称为路径名扩展或通配符)。

将所有行结束符转换为UNIX行结束符(LF)

dos2unix -v *

将所有行结束符转换为Windows行结束符(CRLF)

unix2dos -v * 

-v/——verbose开关不是必需的,但是会输出哪些文件被转换到控制台。

dos2unix和unix2dos都是无处不在的轻量级工具,它们已经预安装在我曾经使用过的每个基于unix的系统上。默认情况下,它们还跳过非文本文件,使它们可以安全地在整个目录上使用,而不像其他一些答案会破坏二进制文件,如.exe和.png。

其他回答

find . -not \( -name .svn -prune -o -name .git -prune \) -type f -exec perl -pi -e 's/\r\n|\n|\r/\n/g' {} \;

这是更安全的,因为它避免破坏你的git回购。将.git, .svn添加或替换为.bzr, .hg或任何你使用的源代码控制到not列表中。

 find ./ -type f -name "*.java" -exec perl -pi -e 's/\r\n|\n|\r/\n/g' {} \;

这对我在wsl2上将所有java文件从CRLF更改为LF是有效的

从2011年开始,目前公认的答案涉及到在dos2unix中使用find -exec,但现在这是不必要的,因为包括Bash在内的绝大多数shell都支持使用通配符来操作目录中的所有文件(称为路径名扩展或通配符)。

将所有行结束符转换为UNIX行结束符(LF)

dos2unix -v *

将所有行结束符转换为Windows行结束符(CRLF)

unix2dos -v * 

-v/——verbose开关不是必需的,但是会输出哪些文件被转换到控制台。

dos2unix和unix2dos都是无处不在的轻量级工具,它们已经预安装在我曾经使用过的每个基于unix的系统上。默认情况下,它们还跳过非文本文件,使它们可以安全地在整个目录上使用,而不像其他一些答案会破坏二进制文件,如.exe和.png。

Dos2unix为您完成了这一点。相当简单的过程。 dos2unix文件名

多亏了toolbear,这里有一个单行程序,可以递归地替换行结束符,并正确地处理空格、引号和shell元字符。

找到。-type f -exec dos2unix {} \;

如果您使用的是dos2unix 6.0二进制文件将被忽略。

假设你有GNU grep和perl,这将递归地将当前目录下的非二进制文件中的CRLF转换为LF:

find . -type f -exec grep -qIP '\r\n' {} ';' -exec perl -pi -e 's/\r\n/\n/g' {} '+'

工作原理

在当前目录下递归查找;改变。博客或其他子目录限制替换:

find .

只匹配常规文件:

  -type f

测试文件是否包含CRLF。排除二进制文件。对每个常规文件运行grep命令。这是排除二进制的代价。如果你有一个旧的grep,你可以尝试使用file命令构建一个测试:

  -exec grep -qIP '\r\n' {} ';'

将CRLF替换为LF。带有第二个-exec的'+'告诉find积累匹配的文件并将它们传递给命令的一个(或尽可能少的)调用——就像管道到xargs,但如果文件路径包含空格、引号或其他shell元字符则没有问题。-pi中的i告诉perl在适当的位置修改文件。您可以在这里使用sed或awk,并做一些工作,您可能会将'+'更改为';',并为每个匹配调用一个单独的进程:

  -exec perl -pi -e 's/\r\n/\n/g' {} '+'