1. 程式人生 > >dd命令、cp命令詳解+dd命令、cp命令對比---delong

dd命令、cp命令詳解+dd命令、cp命令對比---delong

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中找到的是一樣的;另外的版本也許有些微的差別.修正和新增郵到[email protected].報告缺陷到fileutils-

       [email protected].

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、深入研究需要看原始碼,以及測試原始碼的效率。(歡迎討論[email protected]