72 lines
1.7 KiB
Plaintext
72 lines
1.7 KiB
Plaintext
#autoload
|
||
|
||
biggest() {
|
||
emulate -L zsh
|
||
setopt pipe_fail
|
||
|
||
local count=20
|
||
local pattern='*'
|
||
|
||
# Option parsing
|
||
while [[ $# -gt 0 ]]; do
|
||
case "$1" in
|
||
-n|--number)
|
||
count="$2"
|
||
shift 2
|
||
;;
|
||
-p|--pattern)
|
||
pattern="$2"
|
||
shift 2
|
||
;;
|
||
-h|--help)
|
||
cat <<'EOF'
|
||
Usage: biggest [-n COUNT | --number COUNT] [-p PATTERN | --pattern PATTERN]
|
||
|
||
-n, --number Number of entries to show (default: 20)
|
||
-p, --pattern Glob-style pattern to match names (default: *)
|
||
-h, --help Show this help and exit
|
||
|
||
The command scans up to three directory levels below the current
|
||
directory, includes hidden files and directories, and prints the
|
||
largest files/directories sorted by size. Sizes are sorted using
|
||
du -sk (numeric) and displayed using du -sh (human-readable).
|
||
EOF
|
||
return 0
|
||
;;
|
||
--)
|
||
shift
|
||
break
|
||
;;
|
||
-*)
|
||
print -u2 "biggest: unknown option: $1"
|
||
return 1
|
||
;;
|
||
*)
|
||
# Ignore unexpected positional args for now
|
||
break
|
||
;;
|
||
esac
|
||
done
|
||
|
||
# Validate count
|
||
if ! [[ "$count" == <-> ]]; then
|
||
print -u2 "biggest: COUNT must be a positive integer"
|
||
return 1
|
||
fi
|
||
|
||
# Core logic: depth 1–3, files and dirs, include hidden, suppress errors
|
||
find . -mindepth 1 -maxdepth 3 -name "$pattern" -print0 2>/dev/null \
|
||
| xargs -0 -n 100 du -sk 2>/dev/null \
|
||
| sort -nr \
|
||
| head -n "$count" \
|
||
| cut -f2- \
|
||
| tr '\n' '\0' \
|
||
| xargs -0 -I{} du -sh "{}" 2>/dev/null \
|
||
| awk '{
|
||
size=$1
|
||
$1=""
|
||
sub(/^ /,"")
|
||
# green size, blue path
|
||
printf "\033[1;32m%-8s\033[0m \033[1;34m%s\033[0m\n", size, $0
|
||
}'
|
||
} |