Linux技巧——用dd生成指定大小的文件

我们在测试或调试的时候,有时候会需要生成某个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 '{print $1}'`
$ 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 '{print $1}'`
$ 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偏移处

这样基本的参数都介绍全了,无非就是设置输入输出文件以及各自的偏移,设置读写数据块大小和读取数据块个数,下面总结一下

输入参数:
    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 '{print $1}'`
    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

有了这些技巧,在对文件内容无要求的前提下,你就可以任意创建指定大小的文件,任意修改文件指定字节数,这会让某些测试场合变得非常方便

时间: 2024-10-14 21:54:32

Linux技巧——用dd生成指定大小的文件的相关文章

Java、Linux、Win 快速生成指定大小的空文件

Linux dd 命令: dd if=/dev/zero of=<fileName> bs=<一次复制的大小> count=<复制的次数> 生成 50 MB 的空文件: dd if=/dev/zero of=50M-1.txt bs=1M count=50 Windows fsutil 命令: fsutil file createnew <fileName> <文件大小单位字节> 生成 10MB 的空文件: fsutil file createn

Linux中定时删除超过指定大小的文件夹

背景: 开发环境总是动不动就没有空间了, 大部分都是debug日志.所以有必要在日志很疯狂的时候,删除不必要的日志. 思路:一. 书写删除日志文件脚本: 定时任务执行.  但是有时候的日志是需要保存用来查询的.所以不完美. 二. 删除脚本保存,定时任务去查询系统空间是否到达临界值,到达则删除,否则不进行任何操作. 日志删除脚本: #!/bin/sh date "+%Y-%m-%d %H:%M:%S" echo ==========before rm========== df -h ec

PHP 生成指定大小随机图片

PHP 生成指定大小随机图片 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 <?php $image_width = 100; $image_height = 100; $image_str = ''; if (isset($_GET[

Windows平台快速的创建一个指定大小的文件

有时,我们需要快速创建一个指定大小的文件,做系统测试使用,我们指定在Linux平台中可以使用如下命令: 创建一个100M的空文件 dd if=/dev/zero of=hello.txt bs=100M count=1 在windows平台同样可以使用下列命令快速创建一个指定大小的文件: fsutil file createnew <filename> <length> C:\>fsutil file createnew用法 : fsutil file createnew &

php使用curl下载指定大小的文件

php中使用基于libcurl的curl函数,可以对目标url发起http请求并获取返回的响应内容.通常的请求方式类似如下的代码: public function callFunction($url, $postData, $method, header='') {     $maxRetryTimes = 3;     $curl = curl_init();     /******初始化请求参数start******/     if(strtoupper($method) !== 'GET'

python处理文本文件,生成指定格式的文件

import os import sys import string #以指定模式打开指定文件,获取文件句柄 def getFileIns(filePath,model): print("打开文件") print(filePath) print(model) return open(filePath,model) #获取需要处理的文件 def getProcFile(path): return os.listdir(path) #判断是否满足某个条件,如果满足则执行 def isTru

linux shell 脚本 历史文件清理脚本,按天,按月,清理前N天的历史文件,删除指定大小历史文件,历史文件归档清理

不知道大家那有没有要清理的这个事情.需要清理目录历史文件.可能后续也会有很多其他地方需要清理历史文件,可能会用到. 我这两天空闲写了个脚本,清理比较方便,有要进行清理的大量历史文件的话可以用. 脚本用到的命令只有linux才有,像solaris等就不支持,所以只能在linux上运行.如果是nas存储的话,可以挂载到一个linux主机上跑脚本清理. 另外,脚本查找文件用的是ls,但是ls也有最大文件的限度(大概10w以内),如果每天文件很多,每天都是10w+的,运行可能提示文件数过多无法ls. 还

创建指定大小的文件

实现类似Linux下的dd命令: $tempFile="C:\test1" $fs=New-Object System.IO.FileStream($tempFile,[System.IO.FileMode]::OpenOrCreate) $fs.Seek(2GB,[System.IO.SeekOrigin]::Begin) $fs.WriteByte(0) $fs.Close()

生成指定大小文件用于测试

#生成十个文件从1M到10M for i in range(1,11): with open(str(i)+"M.txt","w") as f: f.write(i*1024 * 1024 * '0')