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

2021-07-03 02:58:40 字數 2962 閱讀 2236

我們在測試或除錯的時候,有時候會需要生成某個size的檔案,比如在測試儲存

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

我們來case by case的介紹dd的用法。先看第乙個

生成乙個大小為5g的檔案,內容不做要求

命令如下

$ dd if=/dev/zero of=tmp.5g bs=1g count=5
解釋一下這裡用到的引數

if=file      : 指定輸入檔案,若不指定則從標註輸入讀取。這裡指定為/dev/zero是linux的乙個偽檔案,它可以產生連續不斷的null流(二進位制的0)

of=file : 指定輸出檔案,若不指定則輸出到標準輸出

bs=bytes : 每次讀寫的位元組數,可以使用單位k、m、g等等。另外輸入輸出可以分別用ibs、obs指定,若使用bs,則表示是ibs和obs都是用該引數

count=blocks : 讀取的block數,block的大小由ibs指定(只針對輸入引數)

這樣上面生成5g檔案的命令就很好理解了,即從/dev/null每次讀取1g資料,讀5次,寫入tmp.5g這個檔案

再看下面乙個問題

將file.in的前1m追加到file.out的末尾

命令如下

$ file_out_size=`du -b file.out | awk ''`

$ dd if=./file.in ibs=1m count=1 of=./file.out seek=1 obs=$file_out_size

這裡ibs和obs設定為了不同的值,和前面的命令相比,只多了乙個seek引數

seek=blocks : 在拷貝資料之前,從輸出檔案開頭跳過blocks個block,block的大小由obs指定
命令的意思就是從file.in讀取1個1m的資料塊寫入file.out,不過寫入位置並不在file.out的開頭,而是在1*$file_out_size位元組偏移處(也就是檔案末尾)

在此基礎上再增加乙個要求

將file.in的第3m追加到file.out的末尾

$ file_out_size=`du -b file.out | awk ''`

$ dd if=./file.in skip=2 ibs=1m count=1 of=./file.out seek=1 obs=$file_out_size

這裡多了乙個引數skip

skip=blocks : 拷貝資料前,從輸入檔案跳過blocks個block,block的大小由ibs指定。這個引數和seek是對應的
上面命令的意思就是,從檔案file.in開始跳過2*1m,拷貝1*1m資料,寫入檔案file.out的1*$file_out_size偏移處

這樣基本的引數都介紹全了,無非就是設定輸入輸出檔案以及各自的偏移,設定讀寫資料塊大小和讀取資料塊個數,下面總結一下

輸入引數:

ifskip

ibscount

輸出引數:

ofseek

obs

最後來一道終極題。前面建立的都是null流,這次換乙個

指定某個字元,建立乙個全是這個字元的指定大小的檔案。比如建立乙個檔案,大小為123456位元組,每個位元組都是字元a

這問題看似沒什麼意義,但有時候確實需要用到。比如我通過/dev/null建立了乙個1g的檔案,但是出於測試需求我想修改中間100m資料,這時我需要建立乙個100m的檔案,將該檔案寫入到那個1g檔案的指定位置,而這個100m的檔案是不能從/dev/null建立的,否則達不到修改的目的,這時候就需要這樣的功能了

話不多說,直接上指令碼,有了前面的基礎,相信都能看得懂

#!/bin/bash

if [ $# -ne 3 ];then

echo "usage : $0 character out_file file_size(byte)"

exit 1

fiecho "$1" | grep -q "^[a-za-z]$"

if [ $? -ne 0 ];then

echo "arg1 must be character"

exit 1

ficharacter=$1

out_file=$2

target_size=$3

# echo輸出預設是帶'\n'字元的,所以需要通過dd指定輸入位元組數

echo "$character" | dd of=$out_file ibs=1 count=1

while true

do cur_size=`du -b $out_file | awk ''`

if [ $cur_size -ge $target_size ];then

break

firemain_size=$((target_size-$cur_size))

if [ $remain_size -ge $cur_size ];then

input_size=$cur_size

else

input_size=$remain_size

fidd if=$out_file ibs=$input_size count=1 of=$out_file seek=1 obs=$cur_size || exit 1

done

有了這些技巧,在對檔案內容無要求的前提下,你就可以任意建立指定大小的檔案,任意修改檔案指定位元組數,這會讓某些測試場合變得非常方便

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

生成乙個1g 的檔案,內容全部為0 dd if dev zero of zerofile bs 1m count 1000case2 生產乙個1g 的檔案,內容隨機 dd if dev urandom of randomfile bs 1m count 1000if file 指定輸入檔案,若不指定...

小工具 linux下生成指定大小的檔案 dd

接觸是在測試fdfs時候,發現upload裡面的固定幾個測試檔案沒有,結果open失敗了,所以需要位元組先建立,就接觸到了dd 命令 dd if dev zero of text bs 5k count 1引數說明 if 指定輸入檔案,若不指定則從標準輸入讀取。這裡指定為 dev zero是linu...

linux生成指定大小的檔案

dd if dev zero of 50m.file bs 1m count 50 在當前目錄下生成乙個50m的檔案 虛擬塊裝置檔案更通用的名稱是硬碟映象檔案 hard disk image 但不是所有的硬碟映象檔案都是虛擬塊裝置檔案,例如,目前ghost的gho格式的映象檔案就不能成為虛擬機器中的...