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手冊
3、通過對cp與dd命令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-
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])