zoukankan      html  css  js  c++  java
  • [转]dd命令、cp命令详解+dd命令、cp命令对比 delong

    出处:http://blog.csdn.net/sun_app/article/details/18263299

    1、dd命令详解

    1)中文man手册dd的解释

    NAME       dd - 转换和拷贝文件

    摘要使用方法:

           dd    [--help]   [--version]   [if=file]   [of=file]       [ibs=bytes]   [obs=bytes]   [bs=bytes]   [cbs=bytes]       [skip=blocks]      [seek=blocks]      [count=blocks]

           [conv={ascii, ebcdic, ibm,  block,  unblock,  lcase, ucase, swab, noerror, notrunc, sync}]

    命令描述

           当进行非强制的转换的时候,使用指定的输入和输出块大小拷贝文件       (默认是从标准输入到标准输出。)

           它每次从输入读取指定大小的一个块(默认是512字节)。

       如果使用 bs=bytes 选项,并且没有转换,除了指定 sync,noerror,或 notrunc之外,那么dd将把全部读到的数据(可以比请求读的少)写到独立的输出块去。这个输出块的长度和读到的数据完全一样,除非指定使用sync(同步)转换,那样的话,数据结尾处将追加NULL字符(或空格,见下)。

           其他情况下,输入的时候每次读一个块,然后处理,并将输出结果收集起来,最后写到指定大小的数据块中去。最终的输出块可能会比指定的大小短一些。

           数字值选项(以字节或块为单位)后面可以跟一个乘数:

           k=1024,b=512,w=2,c=1(w和c是GNU扩展语法。最好别使用w,因为在system   V中,它表示2,在4.2  BSD中,它 表示4)。两个或更多的数值表达式可以通过“x”乘起来。

           GEU   fileutils  4.0并且允许在数据块大小的叙述中使用

           下列乘法后缀(用bs=,cbs=,obs=):M=1048576,G=1073741824,

           同理可得T,P,E,Z,Y。D后缀表示数值是以 十进制表示的:kD=1000 MD=1000000 GD=1000000000等等。

           (注意,在ls、df、du命令中,M等标记的大小是由环境变量确定的,而在DD中,它的值是固定的。)

    选项

           if=file:  从 file 中读而不是标准输入。

           of=file: 写到    file     里去而不是标准输出。除非指定conv=notrunc    ,否则,    dd    将把   file截为O字节(或由 seek= 选项指定的大小)

           ibs=bytes: 一次读 bytes 字节。默认是512。

           obs=bytes:一次写 bytes 字节。默认是512。

           bs=bytes:一次读和写 bytes 字节。这将覆盖  ibs  和  obs设定的值(并且,设定  bs  不等于同时将 ibs 和obs 设为同一个值,至少在 只使用 sync, noerror 或notrunc转换时是这样的。因为bs规定,每个输入块都应作为单独的数据块拷贝到输出,而不把较短的块组合到一起)。

           cbs=bytes: 为block 转换和unblock转换指定转换块的大小。

           skip=blocks在拷贝之前,跳过输入文件的前blocks块,每块大小为 ibs-byte 字节。

           seek=blocks 在拷贝之前,跳过输出文件的前blocks块,每块大小为 obs-byte 字节。

           count=blocks 只拷贝输入文件的前   blocks  块(每块的大小为ibs-byte字节),而不是全部内容,直到文件末尾。

           conv=转换"[,"转换"]..." 将文件按 转换参数指定的方式转换(在“,”两边没有空格)

                  转换方式包括:

                  ascii  将EBCDIC转换成ascii。

                  ebcdic 将ascii转换成ebcdic。

                  ibm    将ascii转换成alternative ebcdic。

                  block  每一行输入,无论长短,输出都是  cbs 字节,并且其中的“换行”(NEWLINE,即c中的'0)用空格替换。如有必要,行尾会填充空格。

                  unblock  用“换行”替换每个输入块(cbs 字节大小)末尾的空格。

                  lcase  将大写字母转换成小写。

                  ucase  将小写字母转换成大写。

                  swab   交换每对输入字节。如果读入的字节数是奇数,最后一个字节只是简单的复制到输出(因为没有能跟它交换的 字节了)(POSIX1003.26,PASC翻译1003.2 3号和4号)。

                  noerror 发生读错误时,继续进行。

                  notrunc 不截断输出文件。

                  sync   用0填充到每个输入块的末尾,使其大小为ibs 字节。

    GNU标准选项

           --help 将用法信息打印到标准输出,并成功退出。

          --version       将版本信息打印到标准输出,并成功退出。

           --     结束选项列表。

    环境变量

           LANG, LC_ALL, LC_CTYPE和LC_MESSAGES具有其通常含义。

    遵循标准

           POSIX 1003.2

    举例

           磁带机通常不能接受任意大小的数据块,当最后一个数据片段不能充满整个块时,dd将出现I/O错误。用'dd if=myfile  of=/dev/mytape  conv=sync', 就可以使全部内容存到磁带上。当然,这样做,把文件从磁带上读回时回产生一个稍大些的文件,因为其尾部填充了一些NUL(空字符)。

           本手册页描述了fileutils-4.0软件包中的             dd

           命令。其他版本的dd会与此稍有不同。有关更正和补充可以发帖到中国Linux 论坛-man手册版。报告程序中的错误,请给fileutils-bugs2gnu.ai.wit.edu 发邮件

    2、cp命令详解

    cp命令中文man手册

    NAME       cp - 复制文件和目录

    总览

           cp [选项] 文件路径

           cp [选项] 文件...目录


           POSIX 选项: [-fipRr]

           GNU      参数(最短形式):      [-abdfilprsuvxPR]      [-S      SUFFIX]      [-V  {numbered,existing,simple}] [--sparse=WHEN] [--help] [--version] [--]

    描述

           cp   复制文件(或者目录等).     可以使用这个命令复制一个文件到一个指定的目的地,或者复制任意多个文件到一个目的目录目录.


           如果所给的参数只有两个文件名.它把前一个文件复制到后一个文件上.

           如果最后一个命令参数为一个已经存在的目录名,cp会将每一个源文件复制到那个目录下(维持原文件名).

           如果最后一个参数不是文件名,目录名,和给出多于两个非选项参数,是错误的.

           (因而:如果/b已经存在,那么'cp -r  /a  /b'会复制/a到/b而成为/b/a.而复制/a/x到/b而成为/b/a/x。

    但如果/b事先不存在,它会把/a复制为/b而复制/a/x到/b而成为/b/x.)


           所创建的文件和/或目录的模式和原始的文件的模式是一样的,然后用用户umask值修改(除非使用了-p选项),(但在递归方式复制目录时,新建目录会临时地获得他们的最终模式Ored,连同S_IRWXU(0700),以便进程能够读、写、查找这些新建的目录.


           复制文件到其自身时它什么事情都不做(除了可能会生成一条错误信息以外).复制到一个现存的不同文件时,系统调用函数`open(path,O_WRONLY|O_TRUNC)'打开目的文件.当复制到一个新文件时,系统调用函数`open(path,O_WRONLY|O_CREAT,mode)'创建该文件.如果这操作失败,该文件存在,和给出了-f选项,cp试图先删除该现存文件,如果删除成功则把它当做一个新文件处理.

    POSIX 选项

           POSIX 识别四个半选项:

           -f     如果需要,删除已存在的目的文件.(如前所述.)

           -i     提示是否覆盖现有普通目标文件。(在标准出错上显示问题,从标准输入读取答案.只有明确确认了才复制文件.)

           -p     保留原文件的所有者、组、权限(包括    setuid    和    setgid     位),上次修改时间和上次访问时间。如果制作所有者或组信息的副本时出错,则setuid和setgid位被清空。

                  (要不然源文件和副本的上次访问时间显然是不同的,因为复制操作就是对源文件的访问.)

           -R     递归复制目录,如果对象不是普通文件或目录那么做相应正确处理,(因此,一个FIFO或者特殊文件在复制后仍然是一个FIFO型或者相应特殊文件。)

           -r     递归复制目录,如果对象不是普通文件或目录那么做一些未声明处理.(因此,我们允许并鼓励用  -r  选项做 -R   的同义词.不过那些愚蠢的特征,象那些在GNU版本的 cp 出现的(见下文)也可以用.)


    GNU 细节

           通常,读写文件的方式都是一样的.例外情况见下面的 --sparse 选项.

           缺省情况下,`cp'并不复制目录(参见下文 -r 选项说明).

           cp  通常不会复制文件到自身,但有以下例外:  如果参数 --force --backup 与 源文件一起给出,并且与目的文件并且指向一个普通文件,cp 将生成一个备份文件,不是普通的就是编了号的,就象通常的方法那样声明.在你仅仅想对已有的文件进行备份, 而又不想修改它的时候很有用.


    GNU 选项

           -a, --archive

                  复制时,尽可能保持文件的结构和属性.(但不保持目录 结构)等同于 -dpR。

           -d, --no-dereference

                  复制符号链接作为符号链接而不是复制它指向的文件,

                  并且保护在副本中原文件之间的硬链接.

           -f, --force

                  删除存在的目标文件。 (较:原译文缺下面的部分)

           -i, --interactive

                  无论是否覆盖现存文件都作提示。

           -l, --link

                  制作硬链接代替非目录拷贝。

           -p, --preserve

                  保持原始文件的所有者,组,许可,和时间表属性。

           -P, --parents

                  一个斜杠和指定的源文件名构成目的文件。最后送给cp 的参数必须是一个已存在的目录的名字。

    例如, 下面这个命令:

                  cp --parents a/b/c existing_dir  复制文件 `a/b/c' 到 texisting_dir(现有的目录)/a/b/c',建立任何缺少的中间目录。

           -r     递归地复制目录,复制任何非目录和非符号链接(那是,FIFOs和特别文件)好象他们是常规的文件一样看待.这意味着尝试读出每个源文件的数据,和把它写到目的地上.因而,用这个选项,cp'可能彻底地终止,当不确定地读一个FIFO或者/dev/tty时,(这是一个缺陷.它意味着如果你不知道在这棵树(目录)中有什么要复制的时候,你不得不避开-r并使用-R打开一个未知的设备文件,比如说一台扫描仪,会有未知的效果发生在硬件上)

           -R, --recursive

                  递归地复制目录,保留非目录(参见上面的 -r ).

           --sparse=WHEN

                  一个稀疏file'包容`holes'-占用0字节,它不占用任何物理块;系统把他们作为0调用read'来读.由于许多二进制文件包容许多连续的0字节,这样能保存相当的磁盘空间并且加快速度.省缺情况下,cp通过自然的启发方式发现在源文件里holes并且使相关 的输出文件稀疏.

                  WHEN 值能够是下面中的一个:

                  auto   默认的行为:如果输入文件是稀疏的,输出文件也是稀疏的.

                  always 总是使输出文件稀疏.当输入文件所在的文件系统不支 持稀疏文件的时候,这是有用的,但是输出文件所在的文件系统需要(支持稀疏文件).

                  never  从不使输出文件稀疏.如果你找到一个需要此选项的应用程序,让我们知道.

           -s, --symbolic-link

                  生成符号链接代替非目录拷贝.所有的源文件名必须是绝对的(由`/'开始),除非目的文件是在当前目录.这选项仅仅在系统不支持符号链接时引起一个错误消息.

           -u, --update

                  如果存在的目的地有相同的,或者更新的修改时间,不 复制非目录(文件).

           -v, --verbose

                  在复制前印出文件名.

           -x, --one-file-system

                  跳过来自不同文件系统的子目录.


    GNU 备份选项

           GNU      版本程序象 cp,  mv, ln, install 和patch会在覆盖,改变,或者破坏(文件)前生成一个备份文件. 那个文件由-b选项给出.他们的由-V选项命名.一般情况下备份文件名是源文件名加上后缀,这个后缀由-S 指定.

           -b, --backup        生成关于覆盖和删除的备份.

           -S SUFFIX, --suffix=SUFFIX   加入 SUFFIX(后缀) 到每个备份文件.  如果不指定,使用 SIMPLE_BACKUP_SUFFIX 环境变量的值.如果连 SIMPLE_BACKUP_SUFFIX 都没有设置,省缺是`~'.

           -V METHOD, --version-control=METHOD

                  指定如何命名备份文件. METHOD  能够是`numbered' (or `t'), `existing'  (or `nil'), or `never' (or `simple').  如果不指定,使用  VERSION_CONTROL 环境变量的值.如果VERSION_CONTROL 也没有设置,省缺备份文件类型是

                  `existing'.  这选项相应Emacs变量 `version-control'. 有效的METHODs 是(接受唯一的缩写):t, numbered 总是产生编号的备份。

                  nil, existing

                         Make  numbered  backups  of files that already have them, simple

                         backups of the others.

                  never, simple

                         总作简单的备份.

    GNU 标准选项

           --help 印出用法并退出.

           --version     印出版本信息并退出.

           --     结束选项列表.

    环境(参数)

           变量LANG,LC_ALL,LC_COLLATE,LC_CTYPE和LC_MESSAGES有通常意义.

           对于GNU版本,变量SIMPLE_BACKUP_SUFFIX和VERSION_CONTROL控制备份

           文件命名.与上面的描述一样.

    适用到    POSIX 1003.2

    注意     这份 cp 的描述和FILEUTils-4.0中找到的是一样的;另外的版本也许有些微的差别.修正和新增邮到aeb@cwi.nl.报告缺陷到fileutils-

           bugs@gnu.ai.mit.edu.

    3、通过对cp与dd命令man手册的学习我们看到。

    1)cp命令拷贝过程中是整个文件的拷贝,操作对象最小单位是文件。dd拷贝可以以字节拷贝并且可以设置对数据拷贝的大小。
    2)cp命令可以拷贝文件夹,其实最终还是文件的拷贝,dd不可以拷贝文件夹。

    3)dd还可以完成文件在拷贝过程中的转换(字符的转换,字符的填充等),cp不可以,cp会改变文件本身的属性,比如读写权限,但文件内容不会改变。

    4)dd拷贝是通过扇区完成的,可以完成磁盘数据的完整拷贝。比如硬盘数据备份   dd if=/dev/sda of=/dev/sdh    可以将sda中的数据完整的拷贝到sdh中,扇区数据完全相同。cp不可以。

    5)源码中dd和cp的实现是不一样的,dd在效率上要高于cp,dd使用文件系统接口去实现的就是open等函数,cp不是(还没研究好,大家可以去看一下)。

    4)关于cp命令与dd命令的效率问题。大多数人觉得是dd命令的效率高,这个我测试了一下,测试效果如下:(仅供参考,欢迎讨论)


    1、以上分别测试dd和cp拷贝小文件和大文件的时间

    小文件(小于1k)看不出来,dd和cp的时间都很短,看不出来区别。

    大文件(大于150Mb)看到时间cp要比dd效率高,cp时间为0.208s+0.000s=0.208s ,dd时间为0.812s+0.048s=0.860s(实际测试结果)

    可以再测试下更大的文件是不是有优势!

    2、深入研究需要看源码,以及测试源码的效率。(欢迎讨论delong.wang@sunplusapp.com)

  • 相关阅读:
    delphi shr和shl的作用
    delphi socket 编程 使用多线程
    mysql 移除服务,并在cmd下切换目录
    delphi 结构体和TList的用法
    delphi 使用工控机控件 iThreadTimes 出现问题, 导致主程序创建页面的时候, 阻塞消息, 不能正常执行。
    Unicode 和 UTF-8 的区别
    Python 模块 re (Regular Expression)
    Python的函数式编程
    反向解析与PTR(Pointer Record)
    simhash算法
  • 原文地址:https://www.cnblogs.com/yaoz/p/6905966.html
Copyright © 2011-2022 走看看