linux生成指定大小的文件

# dd if=/dev/zero of=50M.file bs=1M count=50
在当前目录下生成一个50M的文件

虚拟块设备文件更通用的名称是硬盘镜像文件(Hard Disk Image),但不是所有的硬盘镜像文件都是虚拟块设备文件,例如,目前Ghost的GHO格式的镜像文件就不能成为虚拟机中的硬盘。
Linux的dd命令,用来生成虚拟块设备文件。既可以用于创建空镜像文件,也可以用于创建物理硬盘的镜像。
# dd if=/dev/hda0 of=/home/oldsong/hda0.image records in4757130+0 records out
将/dev/hda0的内容复制到/home/oldsong/hda0.image文件。
参数if(input file)告诉dd从哪个文件读取数据,参数 of(output file)告诉dd读出的数据写入哪个文件中。
注意,对于dd来说,输入和输出都是文件,dd做的只是文件拷贝工作,这得益于Unix/linux下面将设备也抽象为特殊的文件。
一般来说设备文件有两种,一种是块设备,一种是字符设备。块设备的特点是可以随机读写(Random Access),比如内存、硬盘等。字符设备的特点是顺序读写(Sequential Access),比如鼠标,键盘,麦克风等。
前面说了如何生成物理硬盘的镜像,如果想生成空镜像文件(本文的主要目的),还需要一个特殊的设备。/dev/zero是Linux提供的一个特殊的字符设备,它的特点是可以永远读该文件,每次读取的结果都是二进制0。下面的命令可以生成一个100M的空镜像文件:
# dd if=/dev/zero of=50M.file bs=1M count=50
bs=1M表示每一次读写1M数据,count=50表示读写 50次,这样就指定了生成文件的大小为50M。bs参数还可以进一步细分为ibs和obs两种,为读操作与写操作分别指定不同的Buffer大小。
这样就生成50M的空镜像文件,问题是,如果要生成1G的虚拟块设备文件,就得占用1G的硬盘空间,而这个镜像文件完全是空的,是不是有一点浪费?好在Linux支持Sparse(稀疏)文件。请看下面的例子
# dd if=/dev/zero of=1G.img bs=1M seek=1000 count=0
# ls -l 1G.img
-rw-r-r- 1 root root 1048576000 Mar 25 15:32 1G.img
# du -m 1G.img
0 1G.img
这里用了一个新的命令seek,表示略过1000个Block不写(这里Block按照bs的定义是1M),count=0表示写入0个Block。用ls(查看文件大小)命令看新生成的文件,大小可以看出是1000M。但是再用du(查看文件占用空间)一看,实际占用硬盘大小只有0M。

因为要用素材生成固定大小的彩信,所以想用一张10K左右的图片加上与之互补的文本文件,两个文件一组拼成标准的10K素材,最后就可以生成出10~100K大小的彩信。
找好图片之后,就用“dd”命令生成与之相应的文本文件。
使用的格式如下:(从sina.html文件读取1024Byte字节生成一个文本文件mm0.txt)
“dd if=/home/sina.html of=/home/mms0.txt bs=1024 count=1”

if的参数是输入文件是新浪的主页,
of的参数是要生成的文件,
bs的参数是每次读入的block大小,这里就设为要生成的文件大小,
count的参数是读取的block个数,这里就设为1。
通过bs和count组合就可以生成指定大小的文件,根据if输入源的不同也内容也可以随机。

二、文件编码转换
    这样生成的文本文件通过彩信发到手机后还存在一个问题:
手机提示这个文本文件是不支持的素材,或者直接无法显示内容。
后来发现是文件编码的问题,封装彩信的时候标明文本素材是UTF-8编码,可是用生成的文件好像是GB2312的编码,跟彩信头指定的编码格式不一样,所以手机就无法识别了。
发现问题之后,就开始解决,用“iconv”命令进行文件编码的转换。
使用的格式如下:
“iconv -f gb2312 -t utf-8 mms0.txt > mm0.txt”
也只是简单的应用。
-f后的参数是输入文件编码
-t后的参数是输出文件编码
mms0.txt是输入文件
mm0.txt是输出文件

 

三、附录
dd命令用法:
dd [选项]
if =输入文件(或设备名称)。
of =输出文件(或设备名称)。
ibs = bytes 一次读取bytes字节,即读入缓冲区的字节数。
skip = blocks 跳过读入缓冲区开头的ibs*blocks块。
obs = bytes 一次写入bytes字节,即写入缓冲区的字节数。
bs = bytes 同时设置读/写缓冲区的字节数(等于设置ibs和obs)。
cbs = byte 一次转换bytes字节。
count=blocks 只拷贝输入的blocks块。
conv = ASCII 把EBCDIC码转换为ASCIl码。
conv = ebcdic 把ASCIl码转换为EBCDIC码。
conv = ibm 把ASCIl码转换为alternate EBCDIC码。
conv = block 把变动位转换成固定字符。
conv = ublock 把固定位转换成变动位。
conv = ucase 把字母由小写转换为大写。
conv = lcase 把字母由大写转换为小写。
conv = notrunc 不截短输出文件。
conv = swab 交换每一对输入字节。
conv = noerror 出错时不停止处理。
conv = sync 把每个输入记录的大小都调到ibs的大小(用NUL填充)。

 

iconv命令用法:
iconv [选项...] [文件...]
输入/输出格式规范:
-f, --from-code=原始文本编码
-t, --to-code=输出文本编码
信息:
-l, --list 列举所有已知的字符集
输出控制:
-c 从输出中忽略无效的字符
-o, --output=FILE 输出文件
-s, --silent 关闭警告
--verbose 打印进度信息
-?, --help 给出该系统求助列表
--usage 给出简要的用法信息
-V, --version 打印程序版本号
avatar
  • 本文由 发表于 2020年12月29日17:52:35
  • 除非特殊声明,本站文章均为原创,转载请务必保留本文链接
匿名

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: