Chinaunix

标题: 请教shell达人,关于find与xargs配合并使用tar命令的问题 [打印本页]

作者: angellp0128    时间: 2009-08-10 11:33
标题: 请教shell达人,关于find与xargs配合并使用tar命令的问题
我想一次性打包 2W个 jpg文件 用了如下两个命令

find . -name "*.jpg" -exec tar -czf picture.tgz {} \;    命令执行完毕后,picture.tgz中只有一个文件

find . -name "*.jpg" | xargs tar -czf picture.tgz        这个命令执行完毕后,picture.tgz中只有907个文件。

以上两个命令都没有成功,我决定问题出在:

第一个命令中,find把找到的2w个文件一次性传送给tar ,此时参数太长导致打包失败,但是执行命令时又没有出现“参数列表过长”的错误信息;

第二个命令中,xargs把find匹配的文件分批传送给tar,但是tar每处理一次都把上一次生成的picture.tgz文件覆盖,导致最后picture.tgz中只有907个文件;

期待达人为我解决一下
作者: Minsic    时间: 2009-08-10 11:54
用-r代替tar命令的-c选项试试?
作者: angellp0128    时间: 2009-08-10 12:00
标题: 回复 #2 Minsic 的帖子
不行呢,会提示 因信号6而终止

首先肯定得用-c 把包打出来,然后才能-r追加,而且好像有-z已经压缩后,就不能-r追加了
作者: Minsic    时间: 2009-08-10 12:05
标题: 回复 #3 angellp0128 的帖子
哦,没文件也会创建的,应该是-z选项阻止了
作者: blackold    时间: 2009-08-10 12:13
先打包,再压缩
作者: angellp0128    时间: 2009-08-10 12:21
标题: 回复 #4 Minsic 的帖子
经过你的提示,我初步解决了这个问题

先用find . -name "*.jpg" | xargs tar -rf picture.tgz  命令打包

然后用gzip命令把打出的包压缩

还有更简单的方法吗 大家帮忙想一下吧~
作者: angellp0128    时间: 2009-08-10 12:22
标题: 回复 #5 blackold 的帖子
恩,刚才我就这样做的
作者: blackold    时间: 2009-08-10 12:24
标题: 回复 #7 angellp0128 的帖子
有时间你可以看看tar文档,就知道有没有更简单的方法了。
作者: Cyberman.Wu    时间: 2009-08-10 13:55
这个和Shell没太大关系吧?我想你刚好想反了,对于find来说-exec是每找到一个满足的就调用一次后面的程序,所以你最后只有一个文件,因为tar的c命令是重新创建的;倒是xargs应该是你说的参数太多原因,能支持的一个命令中带的文件名应该是有限的。

自己写一个程序应该很容易测试出来吧。
作者: ywlscpl    时间: 2009-08-10 14:30
find . -name "*.jpg" -print >list
tar -T list -czvf picture.tar.gz
作者: keymanlu    时间: 2009-08-20 12:54
原帖由 ywlscpl 于 2009-8-10 14:30 发表
find . -name "*.jpg" -print >list
tar -T list -czvf picture.tar.gz

支持这种办法,我师父说,一次不行就分两次,能够解决问题就好
作者: wtuter    时间: 2009-08-20 15:57
标题: 回复 #1 angellp0128 的帖子
-exec会把find查找到的结果一次性全部交给后面的命令来进行处理,
xargs会把find查找到的结果逐一交给后面的命令进行来处理,


所以结果不一样




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2