查找 Busybox 格式的容量详细信息和最旧的文件

查找 Busybox 格式的容量详细信息和最旧的文件

我正在使用 Mobax,它安装了 Busybox。我可以通过键入以下内容成功获取 Linux 中目录及其子目录的容量、可用、已使用和已使用百分比:

clear && date && pwd && du --max-depth=1 -k | sort -nr | cut -f2 | xargs -d '\n' du -sh

我可以通过输入以下内容来获取 Linux 中显示日期、时间和文件名的最旧/最早的文件:

find -type f -printf '%T+ %p\n' | sort | head -n 1

但是,命令中的某些参数无法由 Busybox 直接翻译。你如何翻译或者Busybox可以读取的这些命令的翻译是什么?

答案1

GNUdu --max-depth=1直接翻译为 BusyBox du -d 1。没有相当于xargs -d;的东西如果xargs -0支持,您可以将换行符转换为空字节。

du -d 1 -k | sort -nr | cut -f2 | tr '\n' '\0' | xargs -0 du -sh

BusyBox 有很多编译来调整大小和功能之间的折衷。如果没有du -d,也可以使用du | grep -v '/.*/'。如果您没有du -h,请坚持下去并全部使用千字节。

如果没有xargs -0,您可以使用 shell 循环。

tab="$(printf \\t)"  # or a literal tab character
du -d 1 -k | sort -nr | while IFS= read -r line; do
  line="${line#*$tab}"
  du -sh -- "$line"
done

如果没有 zsh 或 GNU find 等高级工具,就没有好方法在目录树中查找最旧的文件。解析 的输出ls -l是一种选择,但它很痛苦。

一种方法是让我们ls进行排序。这就需要包含时间戳功能。如果是的话,获取当前目录中最旧的文件相对容易:

ls -t | tail -n 1

find涉及时,这会变得更加复杂,因为ls可能会被多次调用,并且排序仅适用于每次调用。您可以做的是每次运行收集所有最旧的文件ls,然后ls再运行一次对这些文件进行排序。希望您不需要超过两个级别。

set -f; IFS='
'
set -- $(find -type f -exec sh -c 'ls -t | tail -n 1' {} +)
ls -t -- "$@" | tail -n 1

或者,如果您ls可以-e选择以统一格式显示时间戳,并且可以sort选择-M按月份名称排序,则可以对其输出进行排序:

LC_ALL=C find -type f -exec ls -lne {} + |
sort -k4,4n -k 1,1M -k 2,2n -k 3,3 |
head -n 1

请注意,如果多个文件在同一秒内具有时间戳,则获得哪个文件是一个机会问题。如果文件系统的粒度不超过秒,这是不可避免的。

没有sort -M,尤其是没有ls -e,您需要更多的按摩。此外,如果没有ls -e,时间戳的分辨率很差:过去 6 个月内修改的文件为一分钟,较旧的文件为一天。您得到的是具有最旧时间戳的随机文件,不一定是最旧的文件。

LC_ALL=C find -type f -exec ls -lne {} + |
sed -e 's/^[^ ]* [ 0-9]*//' |
sed -e 's/^Jan/01/' -e 's/^Feb/02/' -e 's/^Mar/03/' -e 's/^Apr/04/' -e 's/^May/05/' -e 's/^Jun/06/' -e 's/^Jul/07/' -e 's/^Aug/08/' -e 's/^Sep/09/' -e 's/^Oct/10/' -e 's/^Nov/11/' -e 's/^Dec/12/' |
sed -e 's/^\(.. \) /\10/' -e 's/^\(.. .. \) \([0-9][0-9]* \)/\2\1/' |
awk -v y="$(date +%Y)" -v m="$(date +%m)" '$3 ~ /:/ {sub(/^.. .. ..:../, ($1 <= m ? y : y+1) " " $1 " " $2)} 1' |
sort | cut -d ' ' -f 4- |
head -n 1

请注意,在整个答案中,我假设文件名不包含换行符或不可打印的字符。

相关内容