A
cd ..
System

DU Disk Usage Analysis

Analyze disk usage with du and ncdu commands.

2025-12-11
du, ncdu, disk, usage

DU - Disk usage

# Current directory
du

# Human-readable
du -h

# Summary of directory
du -sh directory/

# All files and directories
du -ah

# Max depth
du -h --max-depth=1

Size of specific items

# Single directory
du -sh /var/log

# Multiple items
du -sh /var/log /tmp /home

# Current directory's subdirectories
du -h --max-depth=1 .

# Sort by size
du -h --max-depth=1 | sort -h

Find largest directories

# Top 10 largest
du -h --max-depth=1 | sort -hr | head -10

# In specific path
du -h /var --max-depth=1 | sort -hr | head -10

Exclude patterns

# Exclude directory
du -h --exclude=node_modules

# Multiple exclusions
du -h --exclude=*.log --exclude=.git

# Exclude pattern
du -h --exclude='*.tmp'

Apparent vs actual size

# Apparent size (logical size)
du --apparent-size -h

# Actual size (disk usage - default)
du -h

# Both
du -h --apparent-size && du -h

Total only

# Just total for multiple items
du -ch dir1 dir2 dir3 | tail -1

# Or
du -csh dir1 dir2 dir3

Include/exclude files

# Only count files (not directories)
find . -type f -exec du -ch {} + | tail -1

# Specific file types
find . -name '*.log' -exec du -ch {} + | tail -1

Compare directories

# Size comparison
echo "Dir 1: $(du -sh dir1 | cut -f1)"
echo "Dir 2: $(du -sh dir2 | cut -f1)"

NCDU - Interactive disk usage

# Install
sudo apt install ncdu

# Analyze directory
ncdu /path/to/directory

# Current directory
ncdu

NCDU keyboard shortcuts

up/down  - Navigate
right    - Enter directory
left     - Parent directory
d        - Delete selected
n        - Sort by name
s        - Sort by size
c        - Toggle showing items
g        - Show graph
?        - Help
q        - Quit

Disk usage script

#!/bin/bash

echo "=== Top 10 Largest Directories ==="
du -h --max-depth=1 2>/dev/null | sort -hr | head -10

echo -e "\n=== Disk Usage Summary ==="
df -h /

echo -e "\n=== Large Files (>100MB) ==="
find / -type f -size +100M -exec ls -lh {} \; 2>/dev/null | awk '{print $5, $9}' | sort -hr | head -10

Find space hogs

# Directories over 1GB
du -h --max-depth=2 | grep '^[0-9.]*G'

# Files over 100MB
find / -type f -size +100M -exec ls -lh {} \; 2>/dev/null

# Large log files
find /var/log -type f -size +100M -ls

Track changes over time

# Initial snapshot
du -sh /data > disk-usage-$(date +%Y%m%d).txt

# Compare later
diff disk-usage-20251201.txt disk-usage-20251210.txt

Per-user disk usage

# All users
for user in $(ls /home); do
    echo "$user: $(du -sh /home/$user 2>/dev/null | cut -f1)"
done

# Or with quota
quota -u username

Exclude mounted filesystems

# Don't cross filesystem boundaries
du -h --max-depth=1 -x /

Include hidden files

# Show all including hidden
du -ach .* * | sort -hr | head -20

JSON output (with jq)

du -b | jq -R 'split("\t") | {size: .[0]|tonumber, path: .[1]}'

Real-time monitoring

# Watch directory growth
watch -n 5 'du -sh /var/log'

# Alert on size threshold
while true; do
    SIZE=$(du -s /var/log | cut -f1)
    if [ $SIZE -gt 1000000 ]; then
        echo "Alert: /var/log is ${SIZE}KB"
    fi
    sleep 300
done

Clean up recommendations

#!/bin/bash

echo "=== Cleanup Recommendations ==="

# Old logs
echo "Old logs (>30 days):"
find /var/log -type f -mtime +30 -ls

# Package caches
echo -e "\nPackage cache:"
du -sh /var/cache/apt/archives

# Temp files
echo -e "\nTemp files:"
du -sh /tmp

# Browser cache
echo -e "\nBrowser caches:"
du -sh ~/.cache/

Sparse files

# Check for sparse files
find / -type f -printf "%S\t%p\n" 2>/dev/null | awk '$1 < 1.0'

# Apparent vs actual for sparse
echo "Apparent: $(du --apparent-size -sh file | cut -f1)"
echo "Actual: $(du -sh file | cut -f1)"

By file type

#!/bin/bash

echo "=== Disk Usage by File Type ==="

for ext in log txt pdf jpg png mp4; do
    SIZE=$(find . -name "*.$ext" -exec du -ch {} + 2>/dev/null | tail -1 | cut -f1)
    echo ".$ext files: $SIZE"
done

Docker cleanup

# Docker disk usage
docker system df

# Detailed
docker system df -v

# Cleanup
docker system prune -a

Troubleshooting

df vs du discrepancy

# df shows filesystem usage
df -h /

# du shows directory usage
du -sh /

# Difference usually due to deleted but open files
lsof | grep deleted

Permission denied errors

# Suppress errors
du -sh /var 2>/dev/null

# Or redirect to file
du -sh /var 2>errors.log

Performance optimization

# Faster on large directories
du --max-depth=1 instead of du -ah

# Cache results
du -h / > disk-usage-cache.txt

# Background job
nohup du -h / > /tmp/du-output.txt 2>&1 &

Quick reference

# Basic usage
du -sh directory/              # Summary
du -h --max-depth=1           # One level deep
du -ah directory/             # All files

# Sorting
du -h | sort -h               # Sort by size
du -h --max-depth=1 | sort -hr | head -10  # Top 10

# Exclusions
du -h --exclude=node_modules
du -h --exclude='*.log'

# Interactive
ncdu directory/

# Find large files
find . -type f -size +100M -exec ls -lh {} \;

# Total
du -csh dir1 dir2

Was this useful?

Share with your team

Browse More