我正在使用 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
请注意,在整个答案中,我假设文件名不包含换行符或不可打印的字符。