关于 xargs 参数被截断,tar 文件被覆盖的问题
问题:
目录下共 2W+ 个小文件:
$ find . -type f | wc -l
20083
如果我们这样打包,会爆出 "Argument list too long" 的错误:
$ tar zcf test.tar.gz *
-bash: /bin/tar: Argument list too long
这是由于 * 展开后参数长度超过系统参数 ARG_MAX 的限制
为了不报这种错误,我们考虑用find的参数扩展来试试:
$ find . -type f -name "120150_*" | xargs tar zcvf 120150.tar.gz
这个执行下来没有报错,但是 120150.tar.gz 中并没有包含全部的文件:
$ gzip -d 120150.tar.gz && tar tf 120150.tar | wc -l
3407
Linux 有个系统参数,用来控制命令行下参数的长度(包含环境数据),这个参数是 ARG_MAX ,在正式环境上是 131072 (bytes) :
$ getconf ARG_MAX
131072
凡是超过 131072 bytes 长度的参数都会被截断, * 分批 * 传给 xargs 后面的参数。所以我猜想,第二批参数列表产生的压缩包把第一批参数列表产生的压缩包覆盖掉了,第三批又把第二批覆盖掉了。。。实际上只有最后一次传进来的参数被打进了压缩包中。
解决办法:
先追加打包所有文件,再压缩:
FILE_NUM=$(find . -type f | wc -l)
logger "$BID FILE_NUM = $FILE_NUM"
if [[ $FILE_NUM -gt $FILE_TRANSFER_LIMIT ]];then
logger "FILE_NUM More than $FILE_TRANSFER_LIMIT"
# 先用tar创建一个空的tar包,"tar cf null.tar" 会报错:"tar: Cowardly refusing to create an empty archive"
tar uf ./$BID.tar
# 用xargs追加进去所有的文件,这次不用怕被截断了~
find . -name "${BID}_*" | xargs tar uf ./$BID.tar
# 然后再压缩
gzip ./$BID.tar
else
logger "FILE_NUM Less than $FILE_TRANSFER_LIMIT"
tar zcf ./$BID.tar.gz "$BID"_*
fi
其实 xargs 这些用法的区别有些类似于 http 协议中 " 幂等 " 的概念, tar cf 这种命令是不 " 幂等 " 的, rm 这类的命令则是 " 幂等 " 的,有兴趣的同事可以参考这个链接: http://zh.wikipedia.org/wiki/%E8%B6%85%E6%96%87%E6%9C%AC%E4%BC%A0%E8%BE%93%E5%8D%8F%E8%AE%AE#.E5.AE.89.E5.85.A8.E5.8F.8A.E5.B9.82.E7.AD.89.E6.96.B9.E6.B3.95
- 使用Kotlin开发一个Spring Boot Webflux Streaming应用(附视频)
- 插入排序算法
- Javascript 的addEventListener()及attachEvent()区别分析
- 设计模式-用接口来实现filter!梭梭就是干!
- OpenDaylight实现轮询策略的负载均衡服务
- 微服务业务开发三个难题-拆分、事务、查询(上)
- 总结了一些指针易出错的常见问题(五)
- 微服务业务开发三个难题-拆分、事务、查询(下)
- C语言之控制台读取上下左右方向键指令
- C程序之修改Windows的控制台大小
- VS2010/MFC编程(对话框:模态对话框及其弹出过程)
- 设计模式-抽象类,只是想为你做更多
- 设计模式-搞个接口,留有余地,让你我不再尴尬
- vs2010点调试,显示系统找不到指定的文件
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 学以致用C++设计模式 “模板方法模式”
- 学以致用C++设计模式 “抽象工厂模式”
- 学以致用C++设计模式 之 “工厂模式”
- 六大原则不熟?那你学什么设计模式?来来来,赶紧来!
- 精品:TCP连接的建立和终止
- python--几种快速排序的实现以及运行时间比较
- TCP/IP详解 -奠基篇
- 段错误?打的就是段错误!!
- (Graph)图,挑着看看
- Mybatis学习笔记(四)调用存储过程
- 跟我一起 自己种一颗 AVL树(平衡二叉搜索树)吧!
- mybatis文件映射之利用collection定义关联集合(五)
- 【奇技淫巧】 -- 原地旋转数组
- mybatis文件映射之利用延迟加载解决collection分布查询(六)
- 【C++】攻克哈希表(unordered_map)