出處: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)