[实践Ok]find exec 接合rm -Rf 删除文件和拷备文件的小应用脚本。

jackxiang 2015-3-13 14:11 | |
将目录中的文件查找出来并全部拷备文件到指定目录:
find  . -type f -exec cp -rf {} /tmp/pdf \;

背景:删除一些vim的临时文件及批量文件修改时间,有用xargs的也有用exec......但是这个命令的后面这一部分得小心点写,有一个空格。
第一:花括号}后面必须得有空格.
第二:最后斜杠后面必须得有分号。
第三:exec前面有一个中横线,否则也不行,三者必须要注意。



如:
#!/bin/bash
Redisdb_file=/data/redis/6403/redis.rdb
Redisbak_dir=/data/bak/redis/6403
Bak_time=`date +%Y%m%d%H%M`
mkdir -p $Redisbak_dir
/bin/cp -rf $Redisdb_file $Redisbak_dir/redis.rdb.$Bak_time
find $Redisbak_dir -name "redis.db.201*" -mtime +30 -exec rm -rf {} \;

+ /bin/cp -rf /data/redis/6403/redis.rdb /data/bak/redis/6403/redis.rdb.201610262250
+ find /data/bak/redis/6403 -name 'redis.db.201*' -mtime +30 -exec rm -rf '{}' ';'
-----------------------------------------------------------------------------------------------------------------------------------
[root@iZ25dcp92ckZ jackxiang.com]# find . -name "*.php" -exec grep "messagebox-bottom" {} \;
          <div class="messagebox-bottom">
  <div class="messagebox-bottom"><a href="javascript: window.history.back();">{$lnc[263]}</a> | <a href="index.php">{$lnc[88]}</a> {admin_plus}</div>
  <div class="messagebox-bottom"><a href="javascript: window.history.back();">{$lnc[263]}</a> | <a href="index.php">{$lnc[88]}</a> {admin_plus}</div>


[root@iZ25dcp92ckZ jackxiang.com]# find . -name "*.php" -exec grep -lr -A3 "您目前的用户组是" {} \;
./lang/zh-cn/common.php

======================这儿不得不说xargs和-exec的区别=================================
1)-exec里的{} 相当于一个变量,于是grep时是每次针对单个文件的,所以没有文件名显示。
2)而xagrs是管道,则grep认为是一堆文件进行grep,于是默认就有文件名。


-exec就像这样指定了文件名,当然没有文件名存在了,在使用时根据实际情况进行使用:

=======================================================================================








下面这两种情况都是没法执行得到的,如下:
[root@localhost test]# find . -ctime -1 -exec ls -l  {} \ ;
find: missing argument to `-exec'

[root@localhost test]# find . -ctime -1 -exec ls -l  {} \
>

所以,必须得要注意,而用xargs来做这个就不用那么多事了:
find . -mtime +30 | xargs rm -f
每天运行一次,清理半月外的文件,予以删除:

==================================
[root@localhost ~]# find /tmp -type f    
/tmp/.X0-lock
/tmp/test.pcap
[root@localhost ~]# find /tmp -type f|xargs echo
/tmp/.X0-lock /tmp/test.pcap


exec选项后面跟随着所要执行的命令或脚本,然后是一对儿{ },一个空格和一个\,最后是一个分号。

[root@localhost ~]# find /tmp -type f -exec ls -l {} \;
-r--r--r-- 1 root root 11 Aug 21  2014 /tmp/.X0-lock
-rw-r--r-- 1 root root 24 Mar 10 10:42 /tmp/test.pcap
[root@localhost ~]# find /tmp -type f -exec ls -l {} ;
find: missing argument to `-exec'
[root@localhost ~]# find /tmp -type f -exec ls -l {} \;
-r--r--r-- 1 root root 11 Aug 21  2014 /tmp/.X0-lock
-rw-r--r-- 1 root root 24 Mar 10 10:42 /tmp/test.pcap



应用 一:
  使用功能:删除当前目录下所有的后缀为'~'的文件
  使用场合:VI编辑时经常产生~备份文件,当备份文件时候,特别是生成patch时候,需要将它删掉,否则产生很多垃圾数据,但单个删除太慢,以下为整体删除
    
  find ./ -name \*~ -exec rm -rfv \{\} \;

应用 二:
  使用功能:将当前目录所有的文件的时间更新为当前时间
  使用场合:在嵌入式开发时运行虚拟机器,当windows的时间提前于虚拟机时,则windiows编辑的文件不能在虚拟下正常编译,提示时间太新,这时需同步时间

  find ./ -name \* -exec touch \{\} \;

find -exec 介绍
1. find -exec command {} +  将所用的符合规的文件一起执行一次command 命令
  例:
    touch 1ww 2ww 3ww 4ww
    mkdir 123
    touch 123/4ww
    touch 123/5ww

  find ./ -name \*ww -exec ls -l  \{\} +  
  实际最后执行以下命令:
  ls -l 1ww 2ww 3ww 4ww 123/4ww

2.   find  -exec command {} ;  对符合规则的文件单独执行command命令
  find ./ -name \*ww -exec ls -l  \{\} \;  
  实际最后执行以下命令:
  ls -l 1ww
  ls -l 2ww
        ls -l 3ww
        ls -l 4ww
        ls -l 123/4ww
  ls -l 123/5ww

  3.  find  -execdir command {} +  '+' ';'同上,只是execdir所运行的文件在其文件的当前目录(可消除竞争)
  find ./ -name \*ww -execdir ls -l  \{\} +
  实际最后执行以下命令  
  ls -l 1ww 2ww 3ww 4ww
  pwd ./123
  ls -l 4ww 5ww

  4.   find ./ -name \*ww -execdir ls -l  \{\} \;
  
  ls -l 1ww
  ls -l 2ww
  ls -l 3ww
  ls -l 4ww
  pwd ./123
  ls -l 4ww
  ls -l 5ww  
  


摘自:http://www.cnblogs.com/peida/archive/2012/11/14/2769248.html

作者:jackxiang@向东博客 专注WEB应用 构架之美 --- 构架之美,在于尽态极妍 | 应用之美,在于药到病除
地址:https://jackxiang.com/post/7859/
版权所有。转载时必须以链接形式注明作者和原始出处及本声明!


最后编辑: jackxiang 编辑于2023-1-28 14:39
评论列表
发表评论

昵称

网址

电邮

打开HTML 打开UBB 打开表情 隐藏 记住我 [登入] [注册]