浅谈Linux下通过find命令进行rm文件删除的小技巧
作者:jingxian 发布时间:2023-11-04 23:41:51
我们经常会通过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天前建立的了
2.测试单独模拟执行脚本中的find + rm指令
[root@edbnode1 ~]# /bin/find /enterprisedb_backup/postgresql/ -mtime +7 -exec /bin/rm -rf {} \;
/bin/find: `/enterprisedb_backup/postgresql/network-scripts': No such file or directory
[root@edbnode1 ~]# echo $?
1
[root@edbnode1 ~]# ls /enterprisedb_backup/postgresql/
[root@edbnode1 ~]#
可以看到find操作的确返回了错误的结果,但查看数据备份目录发现,iptables文件及network-scripts目录已经正确删除
3.由于数据已经正确删除,因此我们开始怀疑是由network-scripts目录删除后,find继续尝试删除此目录下其它文件,导致出不“No such file or directory”的错误,因此需要于进一步证实此猜想,重新执行以上“第1步”中的数据环境模拟,并执行以下操作,主要是将rm转换成ls以展现整体运行过程:
[root@edbnode1 ~]# cp -rcp /etc/sysconfig/network-scripts/ /enterprisedb_backup/postgresql/
[root@edbnode1 ~]# cp -rcp /etc/init.d/iptables /enterprisedb_backup/postgresql/
[root@edbnode1 ~]# /bin/find /enterprisedb_backup/postgresql/ -mtime +7 -exec /bin/ls {} \;
ifcfg-eth0 ifcfg-lo ifdown-eth ifdown-isdn ifdown-routes ifupifup-eth ifup-isdn ifup-post ifup-sit init.ipv6-global network-functions-ipv6
ifcfg-eth1 ifdown ifdown-ippp ifdown-post ifdown-sit ifup-aliasesifup-ippp ifup-plip ifup-ppp ifup-tunnel net.hotplug
ifcfg-eth2 ifdown-bnep ifdown-ipv6 ifdown-ppp ifdown-tunnel ifup-bnepifup-ipv6 ifup-plusb ifup-routes ifup-wireless network-functions
/enterprisedb_backup/postgresql/network-scripts/ifup-plusb
/enterprisedb_backup/postgresql/network-scripts/ifup-sit
/enterprisedb_backup/postgresql/network-scripts/ifdown-post
/enterprisedb_backup/postgresql/network-scripts/ifcfg-lo
/enterprisedb_backup/postgresql/network-scripts/network-functions
/enterprisedb_backup/postgresql/network-scripts/ifup-bnep
/enterprisedb_backup/postgresql/network-scripts/ifup-ippp
/enterprisedb_backup/postgresql/network-scripts/ifdown-sit
/enterprisedb_backup/postgresql/network-scripts/ifdown-tunnel
/enterprisedb_backup/postgresql/network-scripts/ifup-plip
/enterprisedb_backup/postgresql/network-scripts/ifup-eth
/enterprisedb_backup/postgresql/network-scripts/ifdown-ipv6
/enterprisedb_backup/postgresql/network-scripts/ifdown-ippp
/enterprisedb_backup/postgresql/network-scripts/ifup-aliases
/enterprisedb_backup/postgresql/network-scripts/network-functions-ipv6
/enterprisedb_backup/postgresql/network-scripts/ifup-ipv6
/enterprisedb_backup/postgresql/network-scripts/ifup-post
/enterprisedb_backup/postgresql/network-scripts/ifcfg-eth2
/enterprisedb_backup/postgresql/network-scripts/ifcfg-eth1
/enterprisedb_backup/postgresql/network-scripts/ifdown-ppp
/enterprisedb_backup/postgresql/network-scripts/ifup-isdn
/enterprisedb_backup/postgresql/network-scripts/ifcfg-eth0
/enterprisedb_backup/postgresql/network-scripts/ifdown
/enterprisedb_backup/postgresql/network-scripts/ifup-wireless
/enterprisedb_backup/postgresql/network-scripts/ifup-ppp
/enterprisedb_backup/postgresql/network-scripts/ifdown-eth
/enterprisedb_backup/postgresql/network-scripts/init.ipv6-global
/enterprisedb_backup/postgresql/network-scripts/ifdown-isdn
/enterprisedb_backup/postgresql/network-scripts/ifup-tunnel
/enterprisedb_backup/postgresql/network-scripts/ifdown-routes
/enterprisedb_backup/postgresql/network-scripts/ifdown-bnep
/enterprisedb_backup/postgresql/network-scripts/net.hotplug
/enterprisedb_backup/postgresql/network-scripts/ifup
/enterprisedb_backup/postgresql/network-scripts/ifup-routes
/enterprisedb_backup/postgresql/iptables
通过以上操作我们可以看到,find命令不单查询了/enterprisedb_backup/postgresql/目录,并且遍历了所有子目录,因此支持了我们的推断
4.综上所述基本定位问题所在
解决方案:
1.整理思路后,可以确认,如果find只找出所需操作目录的第1层文件及目录即可解决此问题
2.通过伟大的 man 命令我们得到以下信息
-maxdepth levels
Descend at most levels (a non-negative integer) levels of directories below the command line arguments. -maxdepth 0 means only apply the tests and actions to the command line arguments.
3.测试操作确认修改为:
[root@edbnode1 ~]# /bin/find /enterprisedb_backup/postgresql/ -mtime +7 -maxdepth 1 -exec /bin/rm -rf {} \;
/bin/find: warning: you have specified the -maxdepth option after a non-option argument -mtime, but options are not positional (-maxdepth affects tests specified before it as well as those specified after it). Please specify options before other arguments.
这里意思是说:-mtime找到的信息可能会操过-maxdepth的范围,在find操作中建议-maxdepth放在所有其他参数的前面
解决结果【完成】
猜你喜欢
- 负载均衡是由多台服务器以对称的方式组成一个服务器集合,每台服务器都具有等价的地位,都可以单独对外提供服务而无须其他服务器的辅助。通过某种负载
- 用过多的Flash要知道,由于搜索引擎技术原因,无法检索到Flash中的内容,因此,在网站中使用过多的Flash会适得其反。而且网站使用过多
- 2月28日上午消息,新浪科技获悉一张百度IM截图。从截图上看,百度IM软件名叫“Baidu Messenger”,并不是之前网友热传的百度小
- SEO,你也许还不太清楚这是个什么东西;SEO,你也许已经发现它成了周围的站长和blogger们津津乐道的话题。无论如何,我希望谨以此文,还
- 一、首先把php的压缩包(这里以PHP4.3.2为例)解压到C:\php-4.3.2-Win32目录中,然后从其中找到一个叫php.ini-
- 最近和一个做市场调查的客户聊天,从他那边了解到市场调查的一些大概步骤。企业在推出一个新产品前一般都是要先对该产品的市场需求做一个市场调查,以
- 1、如何保证百度能每天收录站点新增加的页面?解答:站点保持每天更新好的内容,平稳增加一些鲜活的外链,一段时间后,就会每天都被更新了,这个过程
- 在笔者进行这次企划之前曾经问过自己几个问题,杀毒软件横向测试到底有没有必要?对于这个问题我是相当坚定的,有必要!尽管如今网友们鉴别产品的本事
- 根据中国互联网络信息中心(CNNIC)《2008年中国搜索引擎用户行为研究报告》的调查显示,截至2008年底,中国搜索引擎用户规模达到2.0
- VMware Workstation 是一个虚拟PC的软件,利用VMware工作站,可以在现有的操作系统上虚拟出一个或多个新的硬件环境,相当
- 2009年1月7日,UCenter Home官方站上线了最新的绿色风格模板。伴随着绿色风格模板的推出,UCenter Home的风格模板应用
- QQ网站登录处没有使用https进行加密,而是采用了RSA非对称加密来保护传输过程中的密码以及敏感信息的安全性。 QQ是在javascrip
- 目录简介体系结构ESXI的优点一、什么是vSphere?二、虚拟机的好处三、为什么要使用虚拟机:四、vSphere基础物理架构五、vSphe
- 建立一个普通的Linux分区(主分区、逻辑分区均可)fdisk /dev/sdbCommand (m for help): pDisk /d
- 就在今天早上,微软收购yahoo案终于有了阶段性结果。尽管微软此前将报价提高到每股33美元,yahoo方面依然坚持每股37美元不让步。由于价
- V5mall震撼出击 剑指C2C多用户商城经过半年多的深入研发和多次封闭内测,最受广大网商欢迎的电子商务系统提供商——v5shop在虎年伊始
- Ubuntu下配置samba实现文件夹共享一. samba的安装:sudo apt-get insall sambasudo apt-get
- 先说明下为什么要写这篇文章,以及纠结于这个“小问题”。首先开启静态文件的gzip压缩非常有利用提高网站的访问速度,并且有效减少蜘蛛爬行静态页
- 网站程序上传到服务器的各种方法汇总,制作好网页程序后,如何把网页上传到申请的空间呢?为初学者做一个汇总。上传的定义 上传就是将信息从个人计算
- Centos8最小化部署安装OpenStack Ussuri的教程如下所示:#!/bin/bash#Centos8最小化部署安装OpenSt