Shell

當已用容量達到 95% 時,刪除busybox 中 50GB 最舊的文件

  • October 30, 2016

好的,我在這裡請求了一個程式碼,但最初我並沒有要求讓它兼容busybox。我的錯。我是 Linux 和編碼的新手。

程式碼需要執行以下操作:

當 HD 達到 95% 的容量時,從目錄中刪除 50​​GB 的最舊數據(包含文件的目錄)。

他們給我的程式碼是,這不適用於busybox:

DIRS="a/ b/"
MAXDELBYTES="53687091200" # 50GB
DELBYTES="0"

find $DIRS -type f -printf "%T@ %s %p\n" | sort -r -n | while read time bytes filename
do
   rm -fv "$filename"
   DELBYTES=$((DELBYTES + bytes))

   if [ $DELBYTES -ge $MAXDELBYTES ]; then break; fi
done

什麼不起作用:

  • -printf(將其更改為 -print)
  • %T@ %s %p\n(不知道改成什麼)
  • 不知道還有什麼不工作。我是編碼和 Linux 的新手。

現在需要將它翻譯成busybox,這樣它就可以在我的嵌入式Linux系統上執行。還需要添加一個 cron 命令,以便它在每個星期五執行。

由於find的**busybox實現不提供自定義輸出格式,您需要將格式化任務外包給單獨的程序 :) 幸運的是,甚至包括方便的命令。它的輸出格式欄位與GNU find使用的不同,因此您需要使用的符號也不同。下面的腳本假定並且是那些來自.busyboxstatfind``stat``busybox

DIRS="a/ b/"
MAXDELBYTES="53687091200" # 50GB
DELBYTES="0"

find $DIRS -type f -exec stat -c "%Y %s %n" {} \; | sort -r -n | while read time bytes filename
do
   rm -fv "$filename"
   DELBYTES=$((DELBYTES + bytes))

   if [ $DELBYTES -ge $MAXDELBYTES ]; then break; fi
done

與往常一樣,在使用之前閱讀每個命令的說明。如果是busybox,您將找不到它們的聯機幫助頁,但您可以使用它--help來顯示使用資訊。

請注意,當文件名中包含換行符時,此解決方案可能會在不太可能的情況下破壞事情!這不應該發生在健康的系統上,但可能會發生,例如,如果有人設法闖入系統或利用允許創建任意文件的某些漏洞。

為防止在這種情況下意外刪除有用的文件,您應首先查找並刪除名稱中包含換行符的所有文件。要列出這些,請執行:

find / -name "*
*"

(星號之間只有一個換行符。)然後,當您確定不需要所有這些文件時,使用其中一個刪除它們

find / -name "*
*" -delete

要麼

find / -name "*
*" -print0 | xargs -0 rm -vf

兩者都應該與busybox.

引用自:https://unix.stackexchange.com/questions/46139