免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3528 | 回复: 7
打印 上一主题 下一主题

还是文件截断问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-01-14 22:17 |只看该作者 |倒序浏览
看了一梦如是的帖子,截断头文件的脚本

  1. exec 3<"$1" 4<>"$1" 5<"$1"
  2. head -10 <&3
  3. dd <&3 >&4
  4. :|dd of="$1" obs=$(($(wc -c <&5)-$(wc -c <&4))) seek=1
  5. exec 3<&- 4>&- 5<&-
复制代码


对脚本各部分基本了解了,但是现在我想把脚本拆开执行,比如我现在就想把文件尾部的几行删掉,用如下代码

  1. dd if="$1" of="$1" obs="$2" seek=1
复制代码

执行的结果总是在文件头插入"$2"个字节。

原来的脚本是怎样实现截断的?
要删除的最后几行的空间大小最高效的计算方法是什么?
还请高手多多指点。

论坛徽章:
0
2 [报告]
发表于 2007-01-14 22:30 |只看该作者
  1. { :|dd of=file obs=$(head --lines=-10 <&3 | wc -c) seek=1;} 3<file
复制代码

非linux系统就要换种方法算obs了,大同小异,这样的需求必然要读倒数前10行前面的数据,因此用什么命令算都差不了多少(只要不重复读)。
截断的关键在dd的seek操作数

[ 本帖最后由 一梦如是 于 2007-1-14 22:38 编辑 ]

论坛徽章:
0
3 [报告]
发表于 2007-01-14 22:56 |只看该作者
刚才是我想错了,tail其实要通过seek取文件位置的,这样的需求还是用stat-tail的来算obs,可以避开读文件
  1. :|dd of=file obs=$(($(stat -c %s file)-$(tail -10 file|wc -c))) seek=1
复制代码

[ 本帖最后由 一梦如是 于 2007-1-14 23:04 编辑 ]

论坛徽章:
0
4 [报告]
发表于 2007-01-15 11:23 |只看该作者
根据如是的的提示将脚本改成这样

  1. #!/bin/bash
  2. exec 3<"$1" 4<>"$1" 5<"$1"
  3. head -$2 <&3
  4. #dd <&3 >&4
  5. :|dd of="$1" obs=$(($(wc -c <&5)-$(tail -"$2" "$1"|wc -c))) seek=1
  6. #:|dd of="$1" obs=$(($(wc -c <&5)-$(wc -c <&4))) seek=1
  7. exec 3<&- 4>&- 5<&-
复制代码

已经可以截断文件尾,太谢谢了。

不知道像这样的脚本可不可以在shell下用命令的方式实现?
这个到底是将什么给了后面的dd 作为输入呢?
我将脚本里$(($(wc -c <&5)-$(wc -c <&4)))拿出来,在shell下运行

  1. dd of=file obs=32 seek=1
复制代码

结果保留了file的头32字节,不能删除文件末尾,这是怎么回事?
如果写成

  1. dd if=file of=file obs=32 seek=1
复制代码

结果就更乱了。

[ 本帖最后由 honst 于 2007-1-15 11:28 编辑 ]

论坛徽章:
0
5 [报告]
发表于 2007-01-15 11:42 |只看该作者
":"是空操作,"|"是管道,在shell下用是一样的。

PS:您改的那段,为什么不把head那句注释了,那句在这里已经无用了。

[ 本帖最后由 一梦如是 于 2007-1-15 11:50 编辑 ]

论坛徽章:
0
6 [报告]
发表于 2007-01-15 11:50 |只看该作者
我在shell下做了如下操作

  1. seq 100 >1.log
  2. :|dd of=1.log obs=31 seek=1
复制代码

结果保留的是1.log前31个字节呢?

论坛徽章:
0
7 [报告]
发表于 2007-01-15 11:56 |只看该作者
原帖由 honst 于 2007-1-15 11:50 发表
结果保留的是1.log前31个字节呢?

看我三楼写的
另,您还需要理解并试验一下dd的各个操作数
其实,也可以不必用空操作
  1. dd if=/dev/null of=file obs=n seek=1
复制代码
这样可能更容易理解

论坛徽章:
0
8 [报告]
发表于 2007-01-15 12:02 |只看该作者
啊,明白了,是我算错字节大小了,谢谢
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP