文章

Linux 批量替换文件夹下面的 Windows 换行符替换为 unix 风格换行符

在Linux系统中,Windows风格的换行符(\r\n,即回车加换行)和Unix风格的换行符(\n)是不同的。Windows系统中的文本文件在Linux中可能会显示为带有^M字符的文件,这是因为^M是回车符(CR,Carriage Return)的表示方式。

有的时候将Linux中的文件或者Windows的文件互相拷贝的时候会自动转换换行符,经常遇到的情况是Windows下面可以正常运行一些unix风格的脚本,但是Linux中却无法运行Windows dos风格的文件。 要将一个文件夹中所有文件的Windows换行符替换为Unix风格的换行符,可以使用find命令结合seddos2unix工具来完成。以下是几种方法:

  1. 使用findsed:
    1
    
     find /path/to/folder -type f -exec sed -i 's/\r$//' {} +
    

    这里/path/to/folder是你的文件夹路径。这个命令会找到该文件夹下所有的文件(不包括子文件夹中的文件),并使用sed命令删除每行末尾的^M字符。

  2. 使用finddos2unix: 如果你的系统中安装了dos2unix工具,可以使用以下命令:
    1
    
     find /path/to/folder -type f -exec dos2unix {} +
    

    dos2unix会将Windows格式的文本文件转换为Unix格式。

  3. 使用findunix2dos: 如果你只有unix2dos工具,可以反向使用它来去除^M
    1
    
     find /path/to/folder -type f -exec unix2dos -n {} {}.unix2dos \; && mv {} {}.unix2dos
    

    这个命令首先创建一个临时文件,然后使用unix2dos将Unix格式转换为Windows格式,这会去掉每行末尾的^M。之后,使用mv命令将临时文件替换原文件。

  4. 使用fromdos: 在某些Linux发行版中,fromdos是一个可以用来转换文件的工具:
    1
    
     find /path/to/folder -type f -exec fromdos {} \;
    
***需要注意,使用`sed`的`-i`选项会直接修改原文件,所以在执行之前最好备份你的数据。另外,如果文件夹中包含子文件夹,并且你也希望递归地转换子文件夹中的文件,要修改`find`命令来包括`-depth`参数或相应地调整命令。***

如果只有一个文件或者文件少的话也可以直接通过一些文本编辑器自带的转换功能。如果使用vim/gvim的话可以在命令行模式使用以下方法转换:

1
2
3
4
5
6
7
## 查看当前换行符
:set ff
## 替换为Linux
:set ff=unix

## 替换为Windows
:e +iff=dos
本文由作者按照 CC BY 4.0 进行授权

© TheDarkStarJack. 保留部分权利。

[本站总访问量次] [本站访客数人次] [本文总阅读量次]

本站采用 Jekyll 主题 Chirpy