2017-11-23 18:59:38 yihanzhi 阅读数 935

1、dos2unix

【dos2unix】命令用来将dos格式的文本文件转换成unix格式的文件。

  • DOS下的文本文件是以\r\n作为断行标志的,表示成十六进制就是0D 0A。
  • Unix下的文本文件是以\n作为断行标志的,表示成十六进制就是0A。

DOS格式的文本文件在Linux下,用较低版本的vi打开时行尾会显示‘^M’,而且很多命令都无法很好的处理这种格式的文件,如果是个shell脚本,而Unix格式的文本文件在Windows下用Notepad打开时会拼在一起显示。

语法
dos2unix [options] [-c convmode] [-o file …] [-n infile outfile …]
unix2dos [options] [-c convmode] [-o file …] [-n infile outfile …]

参数说明

参数 描述
-h 显示命令dos2unix联机帮助信息
-k 保持文件时间戳不变
-n 保留源文件,将转换后的内容输出到新文件
-o 修改源文件(默认参数)
-q 静默模式,不输出转换结果信息等
-c 转换模式
-V 显示命令版本信息

示例
例1-操作1个文件:dos2unix -k file
例2-操作多个文件:dos2unix -k file1 file2 file3
例3-不改变源文件,将修改存到新文件:dos2unix -k -n oldfile newfile

2、unix2dos

【unix2dos】命令用来将UNIX格式文本文件转成DOS格式文件。
unix2dos与dos2unix命令操作类似,不再赘述。

参考资料
我使用过的Linux命令之dos2unix - 将DOS格式文本文件转换成UNIX格式
Linux命令学习总结:dos2unix - unix2dos

2013-09-03 14:29:50 boyxulin1986 阅读数 2654

1. unix2dos与dos2unix这两个tool是用来干什么的?
这首先应该要说明一下背景知识:
unix类操作系统下,换行字符是\n;
而早期的dos操作系统,其换行字符是由\r\n组成。
所以如果将unix系统下的文本文件copy到dos系统下
或者将dos系统下的文本文件拷贝到unix下可能会存在问题。
所以就出现了unix2dos以及dos2unix这两个tool。

2. 为什么早期的操作系统换行需要用\r\n两个字符来表示?
关于这个历史就当是看故事吧。
在计算机出现之前,有一种叫做电传打印机的设备,每秒钟打印10个字符,
但是当一行打印结束,需要换到下一行时,需要耗时0.2s做换行回车的动作
将打印机指向下一行起始位置。而如果在这过程中有新的字符传过来,
则该新字符就会丢失。那为了解决这个问题,研究人员就想到了在回车换行的
过程中多打印\r\n这两个不会影响到显示的字符来解决可能存在的字符丢失问题。
而随着计算机的发展,科学家发现用\n一个字符即可达到这种换行回车的目的了。

3. linux系统下的文本文件直接copy到windows下面显示只会显示出一正行长长的字串?
这个目前我也不确定,需要通过实验以及更丰富的理论知识来确认。
如果有知道的朋友,也可以跟我讲喔,谢谢。

4. 所以dos系统下文本文件的size要比unix系统下文本文件的size要小?
毫无疑问,在二者显示内容完全相同的情况下dos系统文本文件每一行都会多一个\r字符。

5. unix2dos源代码应该如何实现?
综上所讲,我们知道unix2dos其实很简单的就是在每一个\n字符前面不上\r字符。
假设unix2dos这个tool的用法是:
./unix2dos ./unix_file ./dos_file
那伪代码过程基本如下:
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
    fp_unix = fopen(argv[1], "rb");
    fp_dos = fopem(argv[2], "wb");
    while(!feof(fp_unix))
    {
        char = fgetc(fp_unix);
        if (char != '\n')
        {
            fputc(char, fp_dos);
        }
        else
        {
            fputc('\r', fp_dos);
            fputc(char, fp_dos);
        }
    }
}

6. dos2unix源代码应该如何实现?
dos2unix的代码实现很类似,区别在于如果连续的两个字符分别为\r,\n,
则需要将\n之前的\r字符删除掉。所以网上有朋友写了类似的程序将文件
中所有的\r字符删除是不正确的,因为\r可能是用户特定有用的字符。
部分代码如下:
while(!feof(fp_dos))
{
    char1 = fgetc(fp_dos);
    char2 = fgetc(fp_dos);
    if (char1 == '\r' && char2 == '\n')
    {
        fputc(char2, fp_unix);
    }
    else
    {
        fputc(char1, fp_unix);
        fputc(char2, fp_unix);
    }
}
以上代码并未做诸多参数有效性检查,出错处理等,仅供参考。

2019-02-26 10:15:28 zhuwei_clark 阅读数 95

在线安装dos2unix

yum -y install dos2unix

转换文件

dos2unix a.txt 

 

2016-09-17 10:59:54 Jerry_1126 阅读数 2580

dos2unix命令--> Dos to UNIX的缩写,用来将DOS格式的文本文件转换为UNIX格式


备注:

1) 为什么需要用dos2unix进行格式转换

在Linux系统下经常会出现下列提示:

/bin/sh^M: bad interpreter: No such file or directory

Window系统中用/r/n来表示换行,Linux中用/n来表示换行,Windows的文本文件,直接拿到Linux中使用可能会会出错,因为多出了“/r”字符,所以需要通过dos2unix 来将window的文本文件转换来适应linux;在Windows下写的文件,到Linux下会出现每行后面有个字符^M,在一些脚本中,这个字符不会被视为空白字符,于是会出现一些莫名奇怪的错误,比如,在vi配置文件virmc中假如有这种字符,打开vi时会提示:
Trailing characters: ^M
用dos2unix就可以解决这个问题,dos2unix file_name , 这样便把文件转为unix格式的,前面的问题也会得到解决

2) 可以使用cat -v来查看是否转换,或者说转换是否成功

3) 模拟下场景,演示dos2unix过程


2015-10-13 10:38:34 Rainnnbow 阅读数 3918

Linux本身提供了dos2unix和unix2dos两个命令来实现Windows和Linux文件的转换。

少量文件转换:

对于单个或少量的文件转换,可以直接使用命令,如:

dos2unix filename1, filename2

大量文件转换:

当需要转换的文件非常多的时候,使用上述方式书写起来非常麻烦;还有就是当参数过长的时候,dos2unix命令可能会出现参数过长,无法解析的错误(一般情况下不会发生这种错误,可以使用“getconf ARG_MAX”命令查看参数的最大长度)。这时就用到了exec命令。exec命令可以把批量的参数拆分为一个一个的参数,多次执行exec之后的命令。如将/apps/cws目录下的所有的以.sh结尾的文件批量转换:

find /apps/cws -name "*.sh" -exec dos2unix {} \;       (注意:一定要有{},标示参数;以“\;”结尾; {} 和\之间一定要有一个空格)
也可以使用xargs命令,不过xargs命令需要和管道符结合使用,并且xargs命令将所有的传入的数据当作一个参数处理。
find /apps/cws -name "*.sh" | xargs dos2unix

关于exec和xargs命令,请参考我的另一篇博客: 

linux中exec和xargs命令的区别和优劣分析


find参考:http://www.jb51.net/os/RedHat/1307.html


最近工作好忙,博客都没有时间写了。。。。。。

dos2unix批量执行

阅读数 28

find -type f | xargs dos2unix -o

博文 来自: dawning126
没有更多推荐了,返回首页