淺談Linux下通過find命令進行rm文件刪除的小技巧
我們經常會通過find命令進行批量操作,如:批量刪除舊文件、批量修改、基于時間的文件統(tǒng)計、基于文件大小的文件統(tǒng)計等,在這些操作當中,由于rm刪除操作會導致目錄結構變化,如果要通過find結合rm的操作寫成腳本,就會遇到一些麻煩,本文通過一個例子為大家進行介紹。
系統(tǒng)環(huán)境:
SUSE Linux Enterprise Server 11 或
Red Hat Enterprise Linux
問題癥狀:
客戶現(xiàn)場有一個自動化的腳本,有以下的find語句,每天運行以刪除某個目錄下7天以前的文件或目錄,這些目錄都是按時間順序生成PostgreSQL數(shù)據(jù)庫的WAL日志及其錯誤日志pg_log:
/bin/find /enterprisedb_backup/postgresql/ -mtime +7 -exec /bin/rm -rf '{}' \;
運行過程中,間歇性地出現(xiàn)以下錯誤:
[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天前的數(shù)據(jù)的確備刪除了。
問題分析:
進行故障重現(xiàn),在另一臺服務器中通過模擬數(shù)據(jù)單獨運行find命令分析此問題,測試過程如下:
1.模擬數(shù)據(jù)
[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 命令使得拷貝到目標目錄的數(shù)據(jù)保持包括:建立時間、用戶權根等信息,以模擬出一個舊文件及一個舊目錄 [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.測試單獨模擬執(zhí)行腳本中的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操作的確返回了錯誤的結果,但查看數(shù)據(jù)備份目錄發(fā)現(xiàn),iptables文件及network-scripts目錄已經正確刪除
3.由于數(shù)據(jù)已經正確刪除,因此我們開始懷疑是由network-scripts目錄刪除后,find繼續(xù)嘗試刪除此目錄下其它文件,導致出不“No such file or directory”的錯誤,因此需要于進一步證實此猜想,重新執(zhí)行以上“第1步”中的數(shù)據(jù)環(huán)境模擬,并執(zhí)行以下操作,主要是將rm轉換成ls以展現(xiàn)整體運行過程:
[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 ifup ifup-eth ifup-isdn ifup-post ifup-sit init.ipv6-global network-functions-ipv6 ifcfg-eth1 ifdown ifdown-ippp ifdown-post ifdown-sit ifup-aliases ifup-ippp ifup-plip ifup-ppp ifup-tunnel net.hotplug ifcfg-eth2 ifdown-bnep ifdown-ipv6 ifdown-ppp ifdown-tunnel ifup-bnep ifup-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放在所有其他參數(shù)的前面
解決結果【完成】
以上這篇淺談Linux下通過find命令進行rm文件刪除的小技巧就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
Red Hat Linux,Apache2.0+Weblogic9.2負載均衡集群安裝配置
這篇文章主要介紹了Red Hat Linux,Apache2.0+Weblogic9.2負載均衡集群安裝配置,需要的朋友可以參考下2014-12-12PXE如何實現(xiàn)自動化部署Linux系統(tǒng)介紹
大家好,本篇文章主要講的是PXE如何實現(xiàn)自動化部署Linux系統(tǒng)介紹,感興趣的同學趕快來看一看吧,對你有幫助的話記得收藏一下,方便下次瀏覽2021-12-12Apache服務器中.htaccess文件的實用配置示例集錦
這篇文章主要介紹了Apache服務器中.htaccess文件的實用配置示例集錦,囊括了防盜鏈重定向及強制瀏覽器下載指定的文件類型等例子,很黃很暴力,需要的朋友可以參考下2016-03-03