[轉]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)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM