从树状目录中查找出特定类型的文件并打包的命令

枕戈待旦勇往直前 2014-03-26 10:45:49
题目如上:从树状目录中查找出特定类型的文件并打包的命令。如文件夹A下面有子文件夹B、C,且A,B,C下面有许多.h,.c,.o的文件,现要求从文件夹A(及其子目录中)中查找出.h文件并打包成一个名为onlyA的压缩包。

目前情况:
find /A -name "*.h" 可以查找出全部的.h文件,但是想直接打包成为onlyA的压缩包如何写才对?

尝试了用管道:
find /A -name "*.h" -print | tar -cf onlyA.tar

报“refusing to create an empty archive”,请问我该如何写这个命令?

...全文
269 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
aaa1111sss 2014-04-12
  • 打赏
  • 举报
回复
你这个问题,跟find所采用的算法有关了。 不知道你了解二叉树、B+树这些查找算法吗? 查找文件,先根据文件名建立查找树,再从树上去查找。 find采用的算法和这些有关的。具体的算法,你得去linux的源码中去看find的源码了。 具体的find算法,我也不知道, 嗯,不过不知道你是不是要对文件结果排序? 那么,可以这样,就会按照文件名排序了。
[root@cahop ~]# find A  -name  "*.c"   | sort
A/1.c
A/B/2.c
A/B/C/3.c
A/B/C/D/4.c
  • 打赏
  • 举报
回复
引用 3 楼 aaa1111sss 的回复:
上面有个地方写错了,帖子不可编辑,我这里说一下: 原文: 这样用的话,-exec执行是条件每触发一次,就执行一次,而tar zcvf会反复去创建压缩包,因此,用-exec的话,最后,压缩包只有一个文件在里面,就是最后一个4.h 应该是: 这样用的话,-exec执行是条件每触发一次,就执行一次,而tar zcvf会反复去创建压缩包,因此,用-exec的话,最后,压缩包只有一个文件在里面,就是find找到的最后一个文件:A/B/2.h
谢谢aaa1111sss,你的解答可以解决我的问题。再问下: find找到的最后一个文件:A/B/2.h 为什么不是最后一个4.h或者1.h呢?
aaa1111sss 2014-03-30
  • 打赏
  • 举报
回复
上面有个地方写错了,帖子不可编辑,我这里说一下: 原文: 这样用的话,-exec执行是条件每触发一次,就执行一次,而tar zcvf会反复去创建压缩包,因此,用-exec的话,最后,压缩包只有一个文件在里面,就是最后一个4.h 应该是: 这样用的话,-exec执行是条件每触发一次,就执行一次,而tar zcvf会反复去创建压缩包,因此,用-exec的话,最后,压缩包只有一个文件在里面,就是find找到的最后一个文件:A/B/2.h
aaa1111sss 2014-03-30
  • 打赏
  • 举报
回复
需要注意的是,不能这样用:

find A  -name  "*.h"  -exec   tar zcvf only.tar  {}  \;
这样用的话,-exec执行是条件每触发一次,就执行一次,而tar zcvf会反复去创建压缩包,因此,用-exec的话,最后,压缩包只有一个文件在里面,就是最后一个4.h

find A  -name  "*.h"  -exec tar zcvf only.tar  {}  \;
A/1.h
A/B/C/D/4.h
A/B/C/3.h
A/B/2.h
看看压缩包到底有什么:

[root@cahop ~]# tar zxvf onlyA.tar 
A/B/2.h #可见,只把find找到的最后一个*.h放在了压缩包里

#而xargs的结果呢?
[root@cahop ~]# tar zxvf only.tar 
A/1.h
A/B/C/D/4.h
A/B/C/3.h
A/B/2.h
#可见,xargs能满足把找到的所有文件打包的要求(但是,xargs也有缺陷,就是参数不能太长,比如你要是有几千上万个*.h的话,可能会报错)
aaa1111sss 2014-03-30
  • 打赏
  • 举报
回复
我亲手做了一下:

[root@aaa ~]# tree A
A
|-- 1.c
|-- 1.h
|-- 1.o
`-- B
    |-- 2.c
    |-- 2.h
    |-- 2.o
    `-- C
        |-- 3.c
        |-- 3.h
        |-- 3.o
        `-- D
            |-- 4.c
            |-- 4.h
            `-- 4.o

3 directories, 12 files
[root@ ~]# 
[root@aaa ~]# 
[root@aaa ~]# find A  -name  "*.h"  |xargs  tar zcvf only.tar 
A/1.h
A/B/C/D/4.h
A/B/C/3.h
A/B/2.h

19,612

社区成员

发帖
与我相关
我的任务
社区描述
系统使用、管理、维护问题。可以是Ubuntu, Fedora, Unix等等
社区管理员
  • 系统维护与使用区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧