我有一个目录,其中包含数千个文件。
我需要按创建日期的降序对文件进行排序(以确保最新的文件不会被删除),并开始对这些文件的大小求和,直到总和达到一定的限制(例如 10GB)。
一旦达到这个目标,我需要能够删除所有文件(已经按降序排序),那些 10GB 文件之后。
那么,运行之后,我的目录下的内容应该是不超过10GB总大小,但必须保留最新的文件。
我需要能够完成这个任务不使用 GAWK因为我没有GNU系统。
仅通过命令可以实现find
吗?
答案1
与zsh
和st_blocks
在系统调用返回的属性lstat()
以 512 字节单位数表示的系统和文件系统上(大多数):
#! /usr/bin/env zsh
zmodload zsh/stat || exit
zmodload zsh/files || exit # for a builtin rm as well.
disk_usage=0 threshold=$(( 10 * 2**30 ))
set -- **/*(ND.om)
for f do
stat -LA blocks +block -- $f &&
(( (disk_usage += blocks * 512) > threshold )) &&
break
shift
done
(( $# == 0 )) || print -r rm -f -- "$@"
(删除print -r
实际执行的操作)。
注意,在累计磁盘使用量中,它只统计普通文件,如果同一个文件有多个硬链接,则它们的大小都会被统计。