在Windows系统下编辑过的文本文件通常都会在行尾留下”^M”符号,在Linux下使用 cat -v filename 可以查看文件中的^M符号。

多出的^M符号是由于Windows/DOS中换行使用的是\r\n两个字符,\r是回车(carriage),\n是换行符(newline)。这个是上古时期使用电传打字机遗留下来的问题,这里不赘述了,感兴趣的同学可以google/baidu。而Linux/macOS下的换行使用的是单个字符\n,没有\r。所以多出的^M符号其实就是回车符,即\r。

\r经常会导致一些莫名其妙的问题,git diff时也会看到^M符号,比较影响观感。所以在Linux/macOS下还是把去掉的好。

删除^M的方式有好几种(dos2unix、vim、sed)其中dos2unix是最简单实用的方式,本文只介绍dos2unix,毕竟我们的目标是解决问题。自然选择最简单实用的方式。

如何使用dos2unix删除^M

Step1 安装 dos2unix

如果系统里面已经有dos2unix了,请直接跳到Step2。

使用系统的包管理工具安装dos2unix

如果是Ubuntu/Debian:

sudo apt-get update
sudo apt-get install dos2unix

如果是macOS

brew install dos2unix

Step2 使用dos2unix删除^M

使用方式如下,此处的filename替换为需要处理的文件名或者文件路径

dos2unix filename

如何批量删除多个文件中的^M

上面的方式单词只能处理一个文件,如果有大量文件需要处理,就不太方便了,下面介绍批量处理的方式。

方法一:使用通配符

处理当前目录下的所有文件(不含子目录中的文件)

dos2unix *

处理当前目录下文件名以”.py”结尾的所有文件(不含子目录中的文件)

dos2unix *.py

方法二:借助find实现批量处理

上述通配符方式不能递归到子目录中,不能进行更精确的选择。借助find可以实现递归和更精确的选择。find命令非常强大,用法也很多,这里只列举几种,更复杂的用法请自行学习find命令的使用。

处理当前目录下的所有普通文件(含子目录)

find $PWD -type f -exec dos2unix {} \;

处理当前目录下文件名以”.py”结尾的所有文件(含子目录中的文件)

find $PWD -name "*.py" -exec dos2unix {} \;