当前位置 主页 > 服务器问题 > Linux/apache问题 >

    浅谈Linux下通过find命令进行rm文件删除的小技巧

    栏目:Linux/apache问题 时间:2019-11-20 18:35

    我们经常会通过find命令进行批量操作,如:批量删除旧文件、批量修改、基于时间的文件统计、基于文件大小的文件统计等,在这些操作当中,由于rm删除操作会导致目录结构变化,如果要通过find结合rm的操作写成脚本,就会遇到一些麻烦,本文通过一个例子为大家进行介绍。

    系统环境:

    SUSE Linux Enterprise Server 11 或

    Red Hat Enterprise Linux

    问题症状:

    客户现场有一个自动化的脚本,有以下的find语句,每天运行以删除某个目录下7天以前的文件或目录,这些目录都是按时间顺序生成PostgreSQL数据库的WAL日志及其错误日志pg_log:

    /bin/find /enterprisedb_backup/postgresql/ -mtime +7 -exec /bin/rm -rf '{}' \;

    运行过程中,间歇性地出现以下错误:

    [root@edb ~]# /bin/find /enterprisedb_backup/postgresql/ -mtime +7 -exec /bin/rm -rf {} \;
    /bin/find: `/enterprisedb_backup/postgresql/network-scripts': No such file or directory
    [root@edb ~]# echo $?
    1
    

    显然,以上命令返回了错误的结果,但客户反映说,以上脚本运行后目录下7天前的数据的确备删除了。

    问题分析:

    进行故障重现,在另一台服务器中通过模拟数据单独运行find命令分析此问题,测试过程如下:

    1.模拟数据

    [root@edbnode1 ~]# date
    Wed Jun 18 23:08:18 CST 2014
    
    [root@edbnode1 ~]# cp -rcp /etc/sysconfig/network-scripts/ /enterprisedb_backup/postgresql/
    [root@edbnode1 ~]# cp -rcp /etc/init.d/iptables /enterprisedb_backup/postgresql/## 以上通过 cp -rcp 命令使得拷贝到目标目录的数据保持包括:建立时间、用户权根等信息,以模拟出一个旧文件及一个旧目录
    
    [root@edbnode1 ~]# ll /enterprisedb_backup/postgresql/
    total 16
    -rwxr-xr-x. 1 root root 9409 Oct 31 2012 iptables
    drwxr-xr-x. 2 root root 4096 Jun 18 2013 network-scripts## 以上可以看到iptables文件是2012年建立的,network-scripts是2013年建立的,都远远超过了7天
    
    [root@edbnode1 ~]# ll /enterprisedb_backup/postgresql/*
    -rwxr-xr-x. 1 root root 9409 Oct 31 2012 /enterprisedb_backup/postgresql/iptables
    
    /enterprisedb_backup/postgresql/network-scripts:
    total 212
    -rw-r--r--. 1 root root  159 Jun 18 2013 ifcfg-eth0
    -rw-r--r--. 1 root root  203 Jun 18 2013 ifcfg-eth1
    -rw-r--r--. 1 root root  203 Jun 18 2013 ifcfg-eth2
    -rw-r--r--. 1 root root  254 Jan 9 2013 ifcfg-lo
    lrwxrwxrwx. 1 root root  20 Jun 18 2013 ifdown -> ../../../sbin/ifdown
    -rwxr-xr-x. 1 root root  627 Jan 9 2013 ifdown-bnep
    -rwxr-xr-x. 1 root root 5397 Jan 9 2013 ifdown-eth
    -rwxr-xr-x. 1 root root  781 Jan 9 2013 ifdown-ippp
    -rwxr-xr-x. 1 root root 4168 Jan 9 2013 ifdown-ipv6
    lrwxrwxrwx. 1 root root  11 Jun 18 2013 ifdown-isdn -> ifdown-ippp
    -rwxr-xr-x. 1 root root 1481 Jan 9 2013 ifdown-post
    -rwxr-xr-x. 1 root root 1064 Jan 9 2013 ifdown-ppp
    -rwxr-xr-x. 1 root root  835 Jan 9 2013 ifdown-routes
    -rwxr-xr-x. 1 root root 1370 Jan 9 2013 ifdown-sit
    -rwxr-xr-x. 1 root root 1434 Jan 9 2013 ifdown-tunnel
    lrwxrwxrwx. 1 root root  18 Jun 18 2013 ifup -> ../../../sbin/ifup
    -rwxr-xr-x. 1 root root 12365 Jan 9 2013 ifup-aliases
    -rwxr-xr-x. 1 root root  859 Jan 9 2013 ifup-bnep
    -rwxr-xr-x. 1 root root 10157 Jan 9 2013 ifup-eth
    -rwxr-xr-x. 1 root root 11971 Jan 9 2013 ifup-ippp
    -rwxr-xr-x. 1 root root 10401 Jan 9 2013 ifup-ipv6
    lrwxrwxrwx. 1 root root   9 Jun 18 2013 ifup-isdn -> ifup-ippp
    -rwxr-xr-x. 1 root root  727 Jan 9 2013 ifup-plip
    -rwxr-xr-x. 1 root root  954 Jan 9 2013 ifup-plusb
    -rwxr-xr-x. 1 root root 2364 Jan 9 2013 ifup-post
    -rwxr-xr-x. 1 root root 4154 Jan 9 2013 ifup-ppp
    -rwxr-xr-x. 1 root root 1925 Jan 9 2013 ifup-routes
    -rwxr-xr-x. 1 root root 3499 Jan 9 2013 ifup-sit
    -rwxr-xr-x. 1 root root 2488 Jan 9 2013 ifup-tunnel
    -rwxr-xr-x. 1 root root 3770 Jan 9 2013 ifup-wireless
    -rwxr-xr-x. 1 root root 4623 Jan 9 2013 init.ipv6-global
    -rwxr-xr-x. 1 root root 1125 Jan 9 2013 net.hotplug
    -rw-r--r--. 1 root root 13079 Jan 9 2013 network-functions
    -rw-r--r--. 1 root root 29853 Jan 9 2013 network-functions-ipv6
    ## 以上可以看到network-script不是一个空的目录,当中还有文件,而且文件也都已经是7天前建立的了