关于 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 

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏软件工程师成长笔记

Mybatis分页插件PageHelper的使用详解

如果你也在用Mybatis,建议尝试该分页插件,个人感觉这个是最方便,超好用的分页插件。 该插件目前支持Oracle,Mysql,MariaDB,SQLite...

1.5K3
来自专栏向治洪

Android 应用安装过程分析

在之前的文章中,我们对PakageManagerService启动流程分析 做了简单的介绍,并对PMS系统的启动流程做了详细的解析。上面只是说到了Android...

7559
来自专栏移动开发面面观

ProgressiveJpeg介绍与在Android中的使用

2624
来自专栏wannshan(javaer,RPC)

ConcurrentHashMap 锁分段 源码分析

看ConcurrentHashMap下几个属性: /** * The default concurrency level for this table...

4176
来自专栏陈树义

玩转SSH(四):Struts + Spring + MyBatis

一、创建 SSMDemo 项目 点击菜单,选择“File -> New Project” 创建新项目。选择使用 archetype 中的 maven-webap...

4736
来自专栏java相关

基于注解实现SpringBoot多数据源配置

1423
来自专栏我是攻城师

在Lucene或Solr中实现高亮的策略

3825
来自专栏解Bug之路

MySql协议详解-CRUD与Result篇

一般对DB的CRUD操作都由com_query报文封装并发送给DB。com_query报文如下图所示:

1223
来自专栏linux驱动个人学习

高通Audio中ASOC的codec驱动(二)

继上一篇文章:高通Audio中ASOC的machine驱动(一) ASOC的出现是为了让codec独立于CPU,减少和CPU之间的耦合,这样同一个codec驱动...

1K6
来自专栏BinarySec

一些pwn题目的解题思路[pwnable.kr] II

目录 以下是solution的目录 #mistake #shellshock #coin1 #blackjack #lotto #cmd1 Other 一些pw...

3995

扫码关注云+社区

领取腾讯云代金券