linux生成指定大小的檔案

2021-06-07 06:12:45 字數 3003 閱讀 9179

# dd if=/dev/zero of=50m.file bs=1m count=50

在當前目錄下生成乙個50m的檔案

虛擬塊裝置檔案更通用的名稱是硬碟映象檔案(hard disk image),但不是所有的硬碟映象檔案都是虛擬塊裝置檔案,例如,目前ghost的gho格式的映象檔案就不能成為虛擬機器中的硬碟。

linux的dd命令,用來生成虛擬塊裝置檔案。既可以用於建立空映象檔案,也可以用於建立物理硬碟的映象。

# dd if=/dev/hda0 of=/home/oldsong/hda0.image records in4757130+0 records out

將/dev/hda0的內容複製到/home/oldsong/hda0.image檔案。

引數if(input file)告訴dd從哪個檔案讀取資料,引數 of(output file)告訴dd讀出的資料寫入哪個檔案中。

注意,對於dd來說,輸入和輸出都是檔案,dd做的只是檔案拷貝工作,這得益於unix/linux下面將裝置也抽象為特殊的檔案。

一般來說裝置檔案有兩種,一種是塊裝置,一種是字元裝置。塊裝置的特點是可以隨機讀寫(random access),比如記憶體、硬碟等。字元裝置的特點是順序讀寫(sequential access),比如滑鼠,鍵盤,麥克風等。

前面說了如何生成物理硬碟的映象,如果想生成空映象檔案(本文的主要目的),還需要乙個特殊的裝置。/dev/zero是linux提供的乙個特殊的字元裝置,它的特點是可以永遠讀該檔案,每次讀取的結果都是二進位制0。下面的命令可以生成乙個100m的空映象檔案:

# dd if=/dev/zero of=50m.file bs=1m count=50

bs=1m表示每一次讀寫1m資料,count=50表示讀寫 50次,這樣就指定了生成檔案的大小為50m。bs引數還可以進一步細分為ibs和obs兩種,為讀操作與寫操作分別指定不同的buffer大小。

這樣就生成50m的空映象檔案,問題是,如果要生成1g的虛擬塊裝置檔案,就得占用1g的硬碟空間,而這個映象檔案完全是空的,是不是有一點浪費?好在linux支援sparse(稀疏)檔案。請看下面的例子

# dd if=/dev/zero of=1g.img bs=1m seek=1000 count=0

# ls -l 1g.img

-rw-r-r- 1 root root 1048576000 mar 25 15:32 1g.img

# du -m 1g.img

0 1g.img

這裡用了乙個新的命令seek,表示略過1000個block不寫(這裡block按照bs的定義是1m),count=0表示寫入0個block。用ls(檢視檔案大小)命令看新生成的檔案,大小可以看出是1000m。但是再用du(檢視檔案占用空間)一看,實際占用硬碟大小只有0m。

「dd if=/home/sina.html of=/home/mms0.txt bs=1024 count=1」

of的引數是要生成的檔案,

bs的引數是每次讀入的block大小,這裡就設為要生成的檔案大小,

count的引數是讀取的block個數,這裡就設為1。

通過bs和count組合就可以生成指定大小的檔案,根據if輸入源的不同也內容也可以隨機。

二、檔案編碼轉換

手機提示這個文字檔案是不支援的素材,或者直接無法顯示內容。

後來發現是檔案編碼的問題,封裝彩信的時候標明文字素材是utf-8編碼,可是用生成的檔案好像是gb2312的編碼,跟彩信頭指定的編碼格式不一樣,所以手機就無法識別了。

發現問題之後,就開始解決,用「iconv」命令進行檔案編碼的轉換。

使用的格式如下:

「iconv -f gb2312 -t utf-8 mms0.txt > mm0.txt」

也只是簡單的應用。

-f後的引數是輸入檔案編碼

-t後的引數是輸出檔案編碼

mms0.txt是輸入檔案

mm0.txt是輸出檔案

三、附錄

dd命令用法:

dd [選項]

if =輸入檔案(或裝置名稱)。

of =輸出檔案(或裝置名稱)。

ibs = bytes 一次讀取bytes位元組,即讀入緩衝區的位元組數。

skip = blocks 跳過讀入緩衝區開頭的ibs*blocks塊。

obs = bytes 一次寫入bytes位元組,即寫入緩衝區的位元組數。

bs = bytes 同時設定讀/寫緩衝區的位元組數(等於設定ibs和obs)。

cbs = byte 一次轉換bytes位元組。

count=blocks 只拷貝輸入的blocks塊。

conv = ascii 把ebcdic碼轉換為ascil碼。

conv = ebcdic 把ascil碼轉換為ebcdic碼。

conv = ibm 把ascil碼轉換為alternate ebcdic碼。

conv = block 把變動位轉換成固定字元。

conv = ublock 把固定位轉換成變動位。

conv = ucase 把字母由小寫轉換為大寫。

conv = lcase 把字母由大寫轉換為小寫。

conv = notrunc 不截短輸出檔案。

conv = swab 交換每一對輸入位元組。

conv = noerror 出錯時不停止處理。

conv = sync 把每個輸入記錄的大小都調到ibs的大小(用nul填充)。

iconv命令用法:

iconv [選項...] [檔案...]

輸入/輸出格式規範:

-f, --from-code=原始文字編碼

-t, --to-code=輸出文字編碼

資訊:-l, --list 列舉所有已知的字符集

輸出控制:

-c 從輸出中忽略無效的字元

-o, --output=file 輸出檔案

-s, --silent 關閉警告

--verbose 列印進度資訊

-?, --help 給出該系統求助列表

--usage 給出簡要的用法資訊

-v, --version 列印程式版本號

Linux 命令生成指定大小的檔案

dd if dev zero of users testmacair documents test.txt bs 1k count 1000 生成1m大小的檔案的方法 注釋 if file used as stdin of file used as stdout bs bytes of a bloc...

Linux 命令生成指定大小的檔案

dd if dev zero of users testmacair documents test.txt bs 1k count 1000 生成1m大小的檔案的方法,單次寫入1k,寫入1000次 dd if dev zero of users testmacair documents test.t...

Linux 用dd生成指定大小的檔案

我們在測試或除錯的時候,有時候會需要生成某個size的檔案,比如在測試儲存 系統時,需要將磁碟剩餘空間減少5g,最簡單的辦法就是拷貝乙個5g的檔案過來,但是從哪兒去弄這樣大小的檔案呢,或許你想到隨便找乙個檔案,不停的拷貝,最後合併,這也不失為一種辦法,但是有了dd,你會更容易且更靈活的實現 我們來c...