2012-03-27 27 views
2

我想做一個cron作業來檢查一個文件夾是否存在,它是否會刪除該文件夾的所有內容。例如,我知道下面將刪除使用的cron我的文件夾的內容:關於在bash中使用crontab的建議

0 * * * * cd home/docs/reports/;rm -r * 

但是,我意識到,如果該文件夾被刪除(或錯誤的文件路徑給出),而不是內容該文件夾被刪除,cd失敗,並且我的操作系統上的所有文件都被刪除。爲了防止這種情況發生(再次)我想先檢查文件夾的存在,然後刪除內容。我想做類似以下的事情,但我不確定如何在cron中使用bash腳本。

if [ -d "home/docs/reports/" ]; then 
    cd home/docs/reports/;rm -r * 
fi 

我是新來的bash和cron(萬一它不明顯)。

+1

不知道爲什麼你需要'cd'來執行命令的目錄 - 只需指定完整的路徑。 – Soren 2012-03-27 22:25:52

回答

7

我認爲cron使用/bin/sh來執行命令。 sh通常是bash的子集,並且您沒有做任何特定的bash。

執行rm命令只有在cd命令成功:

0 * * * * cd home/docs/reports/ && rm -r * 

注意請稍等幾分鐘,而我對此進行測試。如果這個筆記消失了,我已經嘗試過了,它可以工作。

是的,它的工作原理。 (注意:測試目錄是否存在是不可靠的,它有可能是目錄存在,但你不能cd到它,或者它可能停止試驗和cd命令之間存在。)

但實際上你不「噸需要使用這樣的化合物的命令:

0 * * * * rm -r home/docs/reports/* 

仍然&&特技,以及相應的||操作者執行的第二命令僅當第一個失敗,可以是更復雜的操作是非常有用。

雖然這個工作確定,當我試了一下,在您自己的風險使用它(難道你的意思是/home/docs而非home/docs?後者將相對於你的home目錄解釋。)。無論何時您將rm -r與通配符組合在一起,都存在風險。如果可能的話,在一個你確定不關心的目錄中進行測試。如果你想盡可能確保所有東西都被刪除,你可以考慮使用rm -rf。最後,請記住*通配符與名稱以.開頭的文件或目錄不匹配。

#include <stddisclaimer.h> 

編輯:

的意見給了我一個更好的瞭解你想要做什麼。這些文件是用戶在創建後立即下載的文件(對嗎?),因此您不想刪除比5分鐘之前更短的文件。

假設你有GNU的findutils,你可以做這樣的事情:

0 * * * * find /home/docs/reports/* -cmin +5 -delete 2>/dev/null 

使用-delete選項find意味着你一次刪除文件和/或目錄的,而不是刪除整個子樹;主要區別在於不會刪除其中包含新文件的舊目錄。將-delete應用於非空目錄將失敗並顯示錯誤消息。

有關-cmin-delete選項的更多信息,請閱讀GNU查找文檔(info find)。請注意,-ctime在文件的最後一次狀態更改時刻運行,其而不是其創建時間(Unix不記錄文件創建時間)。對於你的情況,它可能是相同的。

(如果你的道路上忽略/*,它會刪除reports目錄本身。)

+0

謝謝@Keith - 是否有一個不太關鍵的操作,我可以先嚐試檢查這是否正常?例如,如果我做了'0 * * * * ls/home/docs/reports/*'會列出所有文件嗎?原本我的意思是'/ home/....'。 – djq 2012-03-27 23:00:23

+0

@celenius:是的,但列表會轉到stdout,'crond'將*嘗試*通過電子郵件發送給您。如果失敗了,你可以執行'ls ...> some-file'。爲了測試crontab命令,我經常使用'* * * * *'(測試後不要忘記清理你的crontab)。有用的提示:我將我的crontab保存在版本控制系統中。 – 2012-03-28 03:03:09

+0

@celenius:需要注意的一件事(正如我在測試完本文後忘記清理自己的crontab時發現的那樣):如果'/ home/doc/reports'中沒有文件,那麼'rm -r/home/docs/reports/*'會生成一條錯誤消息,您將收到一封自動電子郵件。考慮添加'2>/dev/null'放棄任何錯誤消息。 – 2012-03-28 03:37:47

3

包裝你整個命令(包括如果邏輯)到script.sh。

在腳本的頂部指定#!/ bin/bash。

使其可執行:

chmod +x script.sh 

然後指定你的cron作業腳本的完整路徑。

+0

也是一個很好的解決方案。在這種情況下,我認爲這不是必要的,但這是一種很好的技術。 (不要忘記'chmod + x'腳本!) – 2012-03-27 22:54:30

+0

對chmod + x的好的調用,編輯答案。 – merlin2011 2012-03-27 23:11:46

2

最簡單的事情是在你的crontab頂部執行SHELL =/bin/bash。適用於我。