linux生成指定大小的文件

# 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。

 
因爲要用素材生成固定大小的彩信,所以想用一張10K左右的圖片加上與之互補的文本文件,兩個文件一組拼成標準的10K素材,最後就可以生成出10~100K大小的彩信。

找好圖片之後,就用“dd”命令生成與之相應的文本文件。

使用的格式如下:(從sina.html文件讀取1024Byte字節生成一個文本文件mm0.txt)

“dd if=/home/sina.html of=/home/mms0.txt bs=1024 count=1”


if的參數是輸入文件是新浪的主頁,

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 打印程序版本號

發佈了10 篇原創文章 · 獲贊 35 · 訪問量 17萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章