当使用容量达到 95% 时,删除 busybox 中 50GB 最旧​​的文件

Jas*_*per 3 shell cron find busybox files

好的,我在这里请求了一个代码,但最初我没有要求使其与 busybox 兼容。我的错。我是 Linux 和编码的新手。

该代码需要执行以下操作:

当硬盘容量达到 95% 时,从目录中删除 50GB 最旧​​的数据(带有文件的目录)。

他们给我的代码是,这不适用于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
Run Code Online (Sandbox Code Playgroud)

什么不起作用:

  • -printf(改为-print)
  • %T@ %s %p\n(不知道改成什么)
  • 不知道还有什么不工作。我是编码和 Linux 的新手。

现在需要将其转换为busybox,以便它可以在我的嵌入式Linux系统上运行。还需要添加一个 cron 命令,以便它每周五运行。

roz*_*acz 5

由于findbusybox实现不提供自定义输出格式,您需要将格式任务外包给一个单独的程序 :) 幸运的是,甚至包括方便的命令。它的输出格式字段与GNU find使用的不同,因此您需要使用的符号不同。下面的脚本假设和是来自.busyboxstatfindstatbusybox

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
Run Code Online (Sandbox Code Playgroud)

与往常一样,请在使用前阅读每个命令的说明。在 的情况下busybox,您将找不到它们的联机帮助页,但您可以使用它--help来显示使用信息。

请注意,当文件名中包含换行符时,此解决方案可能会在不太可能的情况下破坏事情!这不应该发生在健康的系统上,但可能会发生,例如,如果有人设法闯入系统或利用某些允许创建任意文件的漏洞。

为了防止在这种情况下意外删除有用的文件,您应该首先找到并删除名称中包含换行符的所有文件。要列出这些,请运行:

find / -name "*
*"
Run Code Online (Sandbox Code Playgroud)

(星号之间只有一个换行符。)然后,当您确定不需要所有这些文件时,请使用以下任一命令删除它们

find / -name "*
*" -delete
Run Code Online (Sandbox Code Playgroud)

或者

find / -name "*
*" -print0 | xargs -0 rm -vf
Run Code Online (Sandbox Code Playgroud)

两者都应该与busybox.

  • @Jasper 这意味着您的 Busybox 不包含 `stat` 实用程序。Busybox 是高度可调的,许多功能是可选的。 (3认同)