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来拷贝特殊文件的,发现这种方式不行。
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。