feat: modify dirsize

This commit is contained in:
2026-05-30 14:30:46 +08:00
parent d2f1ca33a0
commit ec19670ebc
+45 -10
View File
@@ -6,7 +6,7 @@ usage() {
cat <<'EOF' cat <<'EOF'
用法: dirsize [选项] [目录] 用法: dirsize [选项] [目录]
查询目录大小,默认扫描当前目录的直接子目录。 查询目录大小,默认列出当前目录下的直接子目录和子文件。
选项: 选项:
-a, --all 递归显示所有子目录的大小 -a, --all 递归显示所有子目录的大小
@@ -16,11 +16,11 @@ usage() {
-h, --help 显示帮助信息 -h, --help 显示帮助信息
示例: 示例:
dirsize 当前目录的直接子目录大小 dirsize 当前目录的直接子项大小
dirsize -n 10 当前目录的直接子目录,取前 10 名 dirsize -n 10 当前目录的直接子项,取前 10 名
dirsize -a 递归显示所有子目录 dirsize -a 递归显示所有子目录
dirsize -d 2 -n 5 深度 2,取前 5 名 dirsize -d 2 -n 5 深度 2,取前 5 名
dirsize -n 5 /var/log 查看 /var/log 的子目录,取前 5 名 dirsize -n 5 /var/log 查看 /var/log 的子项,取前 5 名
EOF EOF
exit 0 exit 0
} }
@@ -77,18 +77,53 @@ if $REVERSE; then
sort_flag="-h" sort_flag="-h"
fi fi
if [[ "$OSTYPE" == "darwin"* ]]; then list_dir_sizes() {
result=$(sudo du -h -d "$DEPTH" "$TARGET_DIR" 2>/dev/null | awk -v dir="$TARGET_DIR" '$2 != dir {print}' | sort $sort_flag) if [[ "$OSTYPE" == "darwin"* ]]; then
else sudo du -h -d "$DEPTH" "$TARGET_DIR" 2>/dev/null
result=$(sudo du -h --max-depth="$DEPTH" "$TARGET_DIR" 2>/dev/null | awk -v dir="$TARGET_DIR" '$2 != dir {print}' | sort $sort_flag) else
fi sudo du -h --max-depth="$DEPTH" "$TARGET_DIR" 2>/dev/null
fi | awk -v dir="$TARGET_DIR" '$2 != dir {print}'
}
# 用 ls 读取直接子文件(一次 readdir),避免 find 递归
list_direct_file_sizes() {
sudo ls -lA "$TARGET_DIR" 2>/dev/null | awk -v dir="$TARGET_DIR" '
function human(bytes, units, i, size) {
split("B K M G T", units, " ")
i = 1
size = bytes
while (size >= 1024 && i < 5) {
size /= 1024
i++
}
if (i == 1) {
return sprintf("%dB", bytes)
}
return sprintf("%.1f%s", size, units[i])
}
/^-/ {
name = $9
for (i = 10; i <= NF; i++) {
name = name " " $i
}
printf "%s\t%s/%s\n", human($5), dir, name
}
'
}
result=$(
{
list_dir_sizes
list_direct_file_sizes
} | sort $sort_flag
)
if [[ "$TOP" -gt 0 ]]; then if [[ "$TOP" -gt 0 ]]; then
result=$(echo "$result" | head -n "$TOP") result=$(echo "$result" | head -n "$TOP")
fi fi
if [[ -z "$result" ]]; then if [[ -z "$result" ]]; then
echo "目录为空或无子目录" echo "目录为空"
exit 0 exit 0
fi fi