Linux复制指定目录及子目录下特定类型的文件

主要参考这个:

http://www.2cto.com/os/201208/144996.html

拷贝一些内容就是:


Linux复制指定目录及子目录下特定类型的文件

 

首先建立一个用于测试的目录


 

可见,目录中主要包含用于测试的*.txt文件和用于充当炮灰的*。tes文件

目标是保持当前的目录结构,只把txt文件复制出来

 

方法一:当不需要的文件类型较为单一时,可以通过完全复制然后删除指定类型的文件完成

Step1 使用命令 cp -r test/ test2 将测试目录test下所有内容完全复制到test2。

 

Step2 组合使用find及xargs,将*.tes文件删除

xargs是给命令传递参数的一个过滤器,可以将前一个命令产生的输出作为后一个命令的参数

命令find test2/ -name ‘*.tes‘ |xargs rm -rf, 即将find产生的输出(test2目录下的所有tes文件),作为rm的参数,从而完全删除



 

适用场景举例:把项目文件备份,要去除其中的.svn文件,可以采用这种方式

 

方法二:需要的文件为单一类型,带目录结构复制

这种情况下可以使用tar命令将指定类型的文件打包,然后解包,同样需要组合使用find和xargs

 

Step1 建立目录test3

mkdir test3

 

Step2 将指定类型文件带目录结构打包

find test/ -name ‘*.txt‘ |xargs tar czf test3.tgz

 

Step3 解包到目录test3

tar zxvf test3.tgz -C test3


另一种方法是用find+cpio,主要参考http://zohead.com/archives/linux-copy-directory-ignore-files/


最后我自己写的脚本是:

find . -regextype posix-egrep -mindepth 1 -regex ‘.*\.(cpp|h)$‘|cpio -admvp ../libcrafter.fil


用tar的方式就是:

find . -regextype posix-egrep -mindepth 1 -regex ‘.*\.(cpp|h)$‘|xargs tar cjf ../libcrafter.bz2


这个有点复杂,更简单些的是:

find . -name "*.cpp" -or -name "*.h"
libcrafter实际要用到Makefile.am,需要的话还需要加上Makefile.am,别的文件基本上不变。

实际工作中用xargs tar ...


-regextype 缺省用emacs-egrep,但是emacs-egrep和posix-egrep很接近,一般这个可以省略了。


因为打包后,文件仅仅74K。否则,用diff处理,发送patch文件就行了。那一般只有多少字节而已。


最后是要用邮件发给在客户那里工作的同事的。

因为同事那里有以前的一个svn拷贝,所以其实只需要发过去从那个svn checkin时间点到现在更新的文件就行了。

参考 http://www.oschina.net/translate/15-practical-unix-linux-find-command-examples-part-2?print

格式类似于:


find libcrafter -mtime -1 #1×24小时内修改的文件

我差不多一天内就会解决bug.

或者比某个文件新的文件:

find libcrafter -newer Makefile.am


最近一次修改时间在1个小时(60分钟)之内的文件或目录

find . -mmin -60  


如果check out文件,那么日期挺新的。


如果是在windows下修改文件,然后再传到svn里,在Linux下svn up,然后调试,可能又有修改。

应该在Windows下,svn up,然后 在cygwin里操作。


这样一来文件体积更小了。


本来想用rsync --include来拷贝特殊文件的,发现这种方式不行。

Linux复制指定目录及子目录下特定类型的文件,古老的榕树,5-wow.com

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。