問題描述
很多公司需要當天定時多次備份數據庫,創建當天日期的目錄及目錄內存放當天備份數據,用網上的腳本出現把整個數據庫備份給刪除了,下面給出了錯誤經過和解決的方法,給同行們參考,注意下操作任何文件請先!!!!備份數據 !!!再測試腳本!!!!
腳本需求
刪除幾天前數據庫備份的目錄及文件。
1.搭建模擬環境
因爲之前的環境已經搞定了,這個模擬下,讓大家瞭解下,不需要的直接看第二部分
[root@foundation0 ~]#mkdir /mysql/{20160401,20160402,20160403.20160404} #創建模擬數據庫備份夾
[root@foundation0 ~]#touch /mysql/2016040{1,2,3,4}/1111 #創建模擬數據庫備份文件
[root@foundation0 ~]# tree /mysq #查看目錄結構有沒有少文件
/mysql
├── 20160401
│?? └── 1111
├── 20160402
│?? └── 1111
├── 20160403
│?? └── 1111
└── 20160404
└── 1111
[root@foundation0 ~]# touch -d "04/01/2016" /mysql/20160401 #修改文件目錄時間戳
[root@foundation0 ~]# touch -d "04/02/2016" /mysql/20160402
[root@foundation0 ~]# touch -d "04/03/2016" /mysql/20160403
[root@foundation0 ~]# touch -d "04/01/2016" /mysql/20160401/1111 #修改文件子目錄時間戳
[root@foundation0 ~]# touch -d "04/02/2016" /mysql/20160402/1111 #重要的是"04/02/2016",一開始我寫成"02/04/2016",結果完全不一樣
[root@foundation0 ~]# touch -d "04/03/2016" /mysql/20160403/1111 #最後查找的結果完全不一樣,給自己挖坑
[root@foundation0 ~]# stat /mysql/20160402/1111 #隨便查看修改後的時間戳
File: ‘/mysql/20160402/1111’
Size: 0 Blocks: 0 IO Block: 4096 regular empty file
Device: 801h/2049d Inode: 23566090 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Context: unconfined_u:object_r:default_t:s0
Access: 2016-04-02 00:00:00.000000000 +0800 #已經變了
Modify: 2016-04-02 00:00:00.000000000 +0800 #已經變了
Change: 2016-04-04 02:09:03.395105983 +0800
Birth: -
2.開始演示錯誤命令
網絡上查到都是這樣的
[root@foundation0 ~]#find /mysql/ -type d -o -type f -ctime +1 -exec rm -rf {} \;
#後面執行的語句暫時去掉“-exec rm -rf {} \;”先看看我們搜索到的結果
#因爲我是改的時間戳所以-ctime,我改成-mtime測試,效果一樣
#後果是什麼呢呵呵,全刪,因爲找到了所有目錄,所有連主/mysql都刪掉了
#很多書上和網上都是這樣的命令,坑哭了多少同胞
[root@foundation0 ~]# find /mysql/ -type d -o -type f -mtime +1
/mysql/
/mysql/20160401
/mysql/20160401/1111
/mysql/20160402
/mysql/20160402/1111
/mysql/20160404
/mysql/20160403
[root@foundation0 ~]# find /mysql/ -type d -o -type f -mtime +2
/mysql/
/mysql/20160401
/mysql/20160401/1111
/mysql/20160402
/mysql/20160404
/mysql/20160403
3.正確命令演示
#既然要刪除目錄和文件爲什麼還要加上“-type d -o -type f”呢
#不經過測試的腳本會死的很慘
[root@foundation0 ~]# find /mysql/ -mtime +1
/mysql/20160401
/mysql/20160401/1111
/mysql/20160402
/mysql/20160402/1111
[root@foundation0 ~]# find /mysql/ -mtime +2
/mysql/20160401
/mysql/20160401/1111
#命令完全版測試結果
[root@foundation0 ~]# find /mysql/ -mtime +2 -exec rm -rf {} \;
find: ‘/mysql/20160401’: No such file or directory
[root@foundation0 ~]# find /mysql/ -mtime +2
[root@foundation0 ~]# ls /mysql/2016040* #查找後確實連目錄都刪掉了,其他沒有文件沒有影響
/mysql/20160402:
1111
/mysql/20160403:
1111
/mysql/20160404:
1111