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

来源:互联网 发布:javascript格式化输出 编辑:程序博客网 时间:2024/05/16 16:57
我们在测试或调试的时候,有时候会需要生成某个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/bashif [ $# -ne 3 ];then    echo "usage : $0 character out_file file_size(Byte)"    exit 1fiecho "$1" | grep -q "^[a-zA-Z]$"if [ $? -ne 0 ];then    echo "arg1 must be character"    exit 1ficharacter=$1out_file=$2target_size=$3# echo输出默认是带'\n'字符的,所以需要通过dd指定输入字节数echo "$character" | dd of=$out_file ibs=1 count=1while truedo    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 1done

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


0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 小孩咳嗽两个月了还不好怎么办 生完小孩肚子瘦不下来怎么办 胆子小一个人在家里都害怕怎么办 怀了双胞胎两个宝宝很挤怎么办 飞机无人陪护如果接机延误该怎么办 过年要坐火车回家 狗狗怎么办 一岁八个月宝宝小腿弯怎么办 2岁宝不愿意坐马桶拉屎怎么办 宝宝两岁多肺炎出院还老咳嗽怎么办 去外国机场买机票不会说外语怎么办 坐飞机不能带的物品办理托运怎么办 深圳外地户口儿童要办身份证怎么办 网上订票错写了护照号怎么办 国航 在智能火车票订飞机票订反了怎么办 办社保卡的时候填错地址怎么办 两个人住酒店只有一张身份证怎么办 农村社保卡信息错了说改不了怎么办 社保卡与原医保卡信息错误怎么办 学校发的社保卡丢了怎么办 魔棒工具选中选区后再怎么办 微信每次打开都出现月球图案怎么办 仙人掌的刺扎手里弄不出来怎么办 保险交满15年领了一年死了怎么办 狗咬了出了点血怎么办 被小狗咬到了吃了海鲜怎么办 想给一个人道歉又不敢说怎么办 被尘封的故事中魔法师不见了怎么办 宝骏5602挡升3挡有点卡怎么办 剥开的榴莲没熟壳又扔了怎么办 视频播放器激活码设备超限了怎么办 ai如何把右边菜单栏隐藏了怎么办 矫正牙齿粘牙齿的胶掉了怎么办 3m双面胶生产的时候胶不干怎么办 新房赠送面积没地热想接地热怎么办 教育网注册报名的用户名忘了怎么办 艺术生校考通过文化没过本线怎么办 想做主持人 但不是播音专业怎么办 微信登录版本最低登录不上怎么办 所录微课的视频声音小是怎么办 电脑开机黑屏只有光标在闪怎么办 联想家悦重装系统时驱动缺失怎么办