Chinaunix首页 | 论坛 | 博客
  • 博客访问: 191054
  • 博文数量: 28
  • 博客积分: 1490
  • 博客等级: 上尉
  • 技术积分: 310
  • 用 户 组: 普通用户
  • 注册时间: 2006-10-17 10:01
文章分类
文章存档

2012年(3)

2011年(2)

2008年(2)

2007年(7)

2006年(14)

我的朋友

分类: LINUX

2007-09-13 17:11:04

利用 find + xargs + cp 在项目中抽取指定文件
作者:徽班进京

有时候,我们需要将项目中一些特定的文件抽取出来,比如:将指定日期后修改的文件抽取出来,──本文就针对这种情况展开讨论。

find 能很好地帮助我们解决问题:
1. 用指定的日期建立一个时间戳文件以做参照;
2. 在指定文件夹下递归找出所有比设定时间戳更新的文件,这里找出所有的 *.c 和 *.h 文件;
3. 删除时间戳临时文件。

$ touch -t 09131630 /tmp/timestamp

$ find /your/project -name '*.[ch]' -newer /tmp/timestamp

$ rm -f /tmp/timestamp


虽然一下子就找到了我要得到的文件,但在我未很好地使用 xargs 以前,这还是一个繁琐的工作,特别是你还想保持原来项目的目录结构!

于是我写了这样一个脚本来做这件事情:


#!/bin/bash


if [ $# -lt 2 ] ; then

    echo "cp_newer_files src_dir date [dst_dir]"

    echo " src_dir: the directory you copy files from"

    echo " date   : which date the files are newer than "

    echo " dst_dir: the directory you copy files to, default: /tmp/myproject"  

    exit 1

fi


src_dir=$1

stamp_date=$2

if [ $# -eq 3 ] ; then

    dst_dir=$3

else

    dst_dir=/tmp/myproject

fi


stamp_file=/tmp/stamp_date$$

touch -t $stamp_date $stamp_file

if [ $? -ne 0 ] ; then

    echo "bad stamp date!!"

    exit 1

fi


find_files=`find $src_dir -name '*.[ch]' -newer $stamp_file`


i="0"

for cfile in $find_files ; do

    dst_file=$dst_dir${cfile#$src_dir}

    mkdir -p `dirname $dst_file`

    cp -a $cfile $dst_file

    i=$[$i+1]

   

    echo ""

    echo "copy $cfile"

    echo "===> $dst_file"

done


echo "" echo "<=== $i files copied. "

rm -f $stamp_file


凑合着用还不错。 但当我发现 xargs 的妙处后着实汗颜:生活其实可以这样轻松,如果你多一点耐心多看一下文档手册!

$ find /your/project -name '*.[ch]' -newer /tmp/timestamp | xargs cp -a --target-directory=/tmp/myproject --parents


So easy, guys!

不过,这个实现和脚本有一点不同的是,他会将 /your/project 的路径也 copy 了,即在 /tmp/myproject 的目录下会是这样的:

/tmp/myproject/your/project/src/core/*.c

而以上的脚本会得到这样的结果:

/tmp/myproject/src/core/*.c

嗯,就这样了。

补充(注意事项):
当 find 和 xargs 组合使用时有一个问题须着重注意,就是当查找结果的文件名里面有空格时会出错,因为 xargs 默认是按空格来处理的。将 find 加上 -print0 参数,并将 xargs 加上 -0 或 --null 参数,所以上面的语句的最终正确写法应该是:

$ find /your/project -name '*.[ch]' -newer /tmp/timestamp -print0 | xargs -0 cp -a --target-directory=/tmp/myproject --parents


本文链接
阅读(1436) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~