Shell指令碼建立指定大小檔案的測試資料

2022-09-26 16:42:17 字數 3165 閱讀 7972

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

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

生成乙個大小為5gwww.cppcns.com的檔案,內容不做要求

命令如下

複製** **如下:

$ 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指定(只針對輸入引數)&nwww.cppcns.combsp;

這樣上面生成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個bldccykcbtpock,block的大小由ibs指定。這個引數和seek是對應的

上面命令的意思就是,從檔案file.in開始跳過2*1m,拷貝1*1m資料,寫入檔案file.out的1*$file_out_size偏移處

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

複製** **如下:

輸入引數: 

if 

skip 

ibs 

count 

輸出引數: 

of 

seek 

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 

fi 

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

if [ $? -ne 0 ];then 

echo "arg1 must be character" 

exit 1 

fi 

character=$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 

fi 

remain_size=$((target_size-$cur_size)) 

if [ $remain_size -ge $cur_size ];then 

input_size=$cur_size 

else 

input_size=$remain_size 

fi 

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

done 

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

本文標題: shell指令碼建立指定大小檔案的測試資料

本文位址: /os/linux/120993.html

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 指定輸入檔案,若不指定...

shell指令碼自動清理超過指定大小的檔案

先說下背景 我們線上用的squid,根據經驗值如果長時間執行則快取目錄下的swap.state會慢慢變大,一旦超過60m,squid的效能就會急劇下降,因此需要定時去清理大於60m的swap.state檔案。由此引出需求,查詢cache目錄下的所有大於60m的swap.state檔案並清除,即 1....

自動清理超過指定大小的檔案 shell指令碼

使用du命令實現 生成幾個測試檔案 root localhost cache dd if dev zero of testfile1 bs 1m count 50 50 0 records in 50 0 records out 52428800 bytes 52 mb copied,0.14518...