Shell脚本创建指定大小文件的测试数据

我们在测试或调试的时候,有时候会需要生成某个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

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

(0)

相关推荐

  • Shell中建立与使用临时性文件的方法详解

    前言 在我们日常开发中经常会需要用到临时文件,本文就给大家介绍了关于Shell建立与使用临时性文件的相关内容,分享出来供大家参考学习,话不多说了,来一起看看详细的介绍: 虽然使用管道可以省去建立临时性文件的需求,不过有时候临时性文件还是派的上用场的.UNIX不同于其他操作系统的地方就是:它没有那种将不再需要的文件设法神奇删除的想法.反倒提供了两个特殊目录:/tmp和/var/tmp(旧系统为:/usr/tmp),这些文件可正常被存储,当它们未被清理干净时也不会弄乱一般的目录.大部分系统上的/tm

  • 判断文件是否存在的shell脚本代码

    实现代码一. #!/bin/sh # 判断文件是否存在 # link:www.jb51.net # date:2013/2/28 myPath="/var/log/httpd/" myFile="/var /log/httpd/access.log" # 这里的-x 参数判断$myPath是否存在并且是否具有可执行权限 if [ ! -x "$myPath"]; then mkdir "$myPath" fi # 这里的-d

  • shell按行读取文件的3种方法

    方法有很多,下面写出三种方法:写法一: 复制代码 代码如下: #!/bin/bashwhile read linedoecho $linedone < filename(待读取的文件) 写法二: 复制代码 代码如下: #!/bin/bashcat filename(待读取的文件) | while read linedoecho $linedone 写法三: 复制代码 代码如下: for line in `cat filename(待读取的文件)`doecho $linedone 说明:for逐行

  • Shell脚本创建指定大小文件的测试数据

    我们在测试或调试的时候,有时候会需要生成某个size的文件,比如在测试存储系统时,需要将磁盘剩余空间减少5G,最简单的办法就是拷贝一个5G的文件过来,但是从哪儿去弄这样大小的文件呢,或许你想到随便找一个文件,不停的拷贝,最后合并,这也不失为一种办法,但是有了dd,你会更容易且更灵活的实现. 我们来case by case的介绍dd的用法.先看第一个 生成一个大小为5G的文件,内容不做要求 命令如下 复制代码 代码如下: $ dd if=/dev/zero of=tmp.5G bs=1G coun

  • 解决Centos7下crontab+shell脚本定期自动删除文件问题

    问题描述: 最近有个需求,就是rsync每次同步的数据量很多,但是需要保留的数据库bak文件 保留7天就够了,所以需要自动清理文件夹内的bak文件 解决方案: 利用shell脚本来定期删除文件夹内的任务 1.创建shell文件 [root@zabbix script]# vim backup_sql_clean.sh #!/bin/sh find /data1/backup/KDKDA\$AGKDPAYKT/XNAKSD/FXUIJ -mtime +10 -name "*.bak" -

  • 利用shell命令删除指定的文件的方法

    今天为了省事文件内容都copy过来了.又为了省事,想了一想,用脚本比较开心.所以就写了一个shell脚本,在此做一个记录. #!/bin/bash ls  -li  | tail -n +2 | cat -n read -p "请输入要删除的行:" num inum=`ls -li  | tail -n +2 | cat -n | awk -F ' ' '$1=='$num'{print $2}'` find ./  -inum $inum -exec rm -rf {} \; 运行脚

  • shell脚本如何读取properties文件中的值

    如下面代码所示的properties文件是各种编程语言中常用的属性文件,通过key读取value是极其常见的需求. # 端口 server.port=8520 # 上传文件总的最大值 spring.servlet.multipart.max-request-size=10MB # 单个文件的最大值 spring.servlet.multipart.max-file-size=10MB Linux中的shell通常是需要程序员自己写一个方法实现对properties文件的读取.以下是我写的一个方法

  • shell脚本实现定时删除文件或文件夹

    一.删除XX天(默认10天)之前某个目录下面带.log的日志文件,并且输出文件显示删除的文件 #!/bin/sh #如果没有输入变量值,默认天数为10 start=$(date +%y-%m-%d-%H%M%m) File=/temp/delete_$start.txt FilePath=/data echo $File if [ ! -n "$1" ]; then     day=10 else      day=$1 fi #-mtime 10 表示文件修改时间距离当前为0天的文件

  • php查找指定目录下指定大小文件的方法

    本文实例讲述了php查找指定目录下指定大小文件的方法.分享给大家供大家参考.具体实现方法如下: php查找文件大小的原理是遍历目录然后再利用filesize来计算文件大小,然后我们再加一判断就可以了,下面整理了一些例子. 我们先来看遍历目录,代码如下: 复制代码 代码如下: function tree($directory)  {   $mydir = dir($directory);   echo "<ul>n";   while($file = $mydir->r

  • Shell脚本监控目录内文件改动

    废话不多说了,直接给大家贴代码,具体代码如下所示: #! /bin/bash webroot="/home/www/" cp /dev/null rsync_file if [ ! -f file.md5 ];then find $webroot -type f -exec md5sum {} \; >>file.md5 else for file in $(md5sum -c file.md5|awk -F':' '/FAILED/{print $1}') do if [

  • 详解python执行shell脚本创建用户及相关操作

    用户发送请求,返回帐号和密码 ###利用框架flask 整体思路: # 目的:实现简单的登录的逻辑 # 1需要get和post请求方式 需要判断请求方式 # 2获取参数 # 3执行shell # 4如果判断都没问题,就返回结果 导包 ... 给模版传递消息 用flash --需要对内容加密,因此需要设置 secret_key , 做加密消息的混淆 app = Flask(__name__) app.secret_key = 'kingdomai' 使用wtf实现表单,需要自定义一个表单类 #va

  • 在python中创建指定大小的多维数组方式

    python中创建指定大小的二维数组,有点像C++中进行动态申请内存创建数组,不过相比较而言,python中更为简单一些. 创建n行m列的二维数组: n = 2 m = 3 matrix = [None]*2 for i in range(len(matrix)): matrix[i] = [0]*3 print(matrix) 当然也可以使用list comprehension的方式创建: n = 2 m = 3 matrix = [[0]*m for i in range(n)] print

  • shell脚本for循环实现文件和目录遍历

    一个for循环实现一个目录下的文件和目录遍历,很实用 [root@localhost shell_order]# cat test27.sh #!/bin/bash #print the directory and file for file in /home/hustyangju/* do if [ -d "$file" ] then echo "$file is directory" elif [ -f "$file" ] then echo

随机推荐