好吧,我在这里请求了一个代码,但最初我并没有要求使其与 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 查找用途不同,所以需要使用的符号也不同。下面的脚本假设 和find
是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
.
答案2
一般来说,解析输出是一个坏主意ls
。但在没有stat
、没有 zsh、没有、没有 perl 或其他大型脚本语言的嵌入式系统上find -printf
,这是按日期对文件进行排序的唯一方法。假设您的文件名不包含空格,也不包含空格\'"
(这xargs
会造成损坏)(这是您的原始脚本所做的假设),您可以用来xargs ls -str
显示按日期排序的文件,并在进程中显示它们的大小。
find $DIRS -type f |
xargs ls -str |
while read kilobytes filename; do …
请注意,大小以千字节而不是字节显示。此外,这是文件占用的磁盘空间,而不是文件中的字节数。通常,这个数字是文件大小,向上舍入到下一个整数块,但如果文件是疏。在释放磁盘空间的脚本中,这可能就是您想要的。
上面的脚本有一个很大的警告:如果文件数量足够小,可以xargs
对ls
.如果多次调用ls
,则每次调用都会单独对其参数进行排序。您可以使用 打印文件日期ls
,但对这种人类可读的输出进行排序非常复杂。至少检测错误情况的更好解决方案是将 的输出替换find
到命令行中。
{ set -f; IFS='
'; ls -str $(find $DIRS -type f); } |
while read -r kilobytes filename; do …