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

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

好吧,我在这里请求了一个代码,但最初我并没有要求使其与 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

什么不起作用:

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

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

答案1

自从忙碌盒实施寻找不提供自定义输出格式,您需要将格式化任务外包给单独的程序:)幸运的是,甚至busybox包括方便的stat命令。它的输出格式字段不同于GNU 查找用途不同,所以需要使用的符号也不同。下面的脚本假设 和findstat来自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.

答案2

一般来说,解析输出是一个坏主意ls。但在没有stat、没有 zsh、没有、没有 perl 或其他大型脚本语言的嵌入式系统上find -printf,这是按日期对文件进行排序的唯一方法。假设您的文件名不包含空格,也不包含空格\'"(这xargs会造成损坏)(这是您的原始脚本所做的假设),您可以用来xargs ls -str显示按日期排序的文件,并在进程中显示它们的大小。

find $DIRS -type f |
xargs ls -str |
while read kilobytes filename; do …

请注意,大小以千字节而不是字节显示。此外,这是文件占用的磁盘空间,而不是文件中的字节数。通常,这个数字是文件大小,向上舍入到下一个整数块,但如果文件是。在释放磁盘空间的脚本中,这可能就是您想要的。

上面的脚本有一个很大的警告:如果文件数量足够小,可以xargsls.如果多次调用ls,则每次调用都会单独对其参数进行排序。您可以使用 打印文件日期ls,但对这种人类可读的输出进行排序非常复杂。至少检测错误情况的更好解决方案是将 的输出替换find到命令行中。

{ set -f; IFS='
'; ls -str $(find $DIRS -type f); } |
while read -r kilobytes filename; do …

相关内容