DU - Disk usage
du
du -h
du -sh directory/
du -ah
du -h --max-depth=1
Size of specific items
du -sh /var/log
du -sh /var/log /tmp /home
du -h --max-depth=1 .
du -h --max-depth=1 | sort -h
Find largest directories
du -h --max-depth=1 | sort -hr | head -10
du -h /var --max-depth=1 | sort -hr | head -10
Exclude patterns
du -h --exclude=node_modules
du -h --exclude=*.log --exclude=.git
du -h --exclude='*.tmp'
Apparent vs actual size
du --apparent-size -h
du -h
du -h --apparent-size && du -h
Total only
du -ch dir1 dir2 dir3 | tail -1
du -csh dir1 dir2 dir3
Include/exclude files
find . -type f -exec du -ch {} + | tail -1
find . -name '*.log' -exec du -ch {} + | tail -1
Compare directories
echo "Dir 1: $(du -sh dir1 | cut -f1)"
echo "Dir 2: $(du -sh dir2 | cut -f1)"
NCDU - Interactive disk usage
sudo apt install ncdu
ncdu /path/to/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
du -h --max-depth=2 | grep '^[0-9.]*G'
find / -type f -size +100M -exec ls -lh {} \; 2>/dev/null
find /var/log -type f -size +100M -ls
Track changes over time
du -sh /data > disk-usage-$(date +%Y%m%d).txt
diff disk-usage-20251201.txt disk-usage-20251210.txt
Per-user disk usage
for user in $(ls /home); do
echo "$user: $(du -sh /home/$user 2>/dev/null | cut -f1)"
done
quota -u username
Exclude mounted filesystems
du -h --max-depth=1 -x /
Include hidden files
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 -n 5 'du -sh /var/log'
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 ==="
echo "Old logs (>30 days):"
find /var/log -type f -mtime +30 -ls
echo -e "\nPackage cache:"
du -sh /var/cache/apt/archives
echo -e "\nTemp files:"
du -sh /tmp
echo -e "\nBrowser caches:"
du -sh ~/.cache/
Sparse files
find / -type f -printf "%S\t%p\n" 2>/dev/null | awk '$1 < 1.0'
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 system df
docker system df -v
docker system prune -a
Troubleshooting
df vs du discrepancy
df -h /
du -sh /
lsof | grep deleted
Permission denied errors
du -sh /var 2>/dev/null
du -sh /var 2>errors.log
Performance optimization
du --max-depth=1 instead of du -ah
du -h / > disk-usage-cache.txt
nohup du -h / > /tmp/du-output.txt 2>&1 &
Quick reference
du -sh directory/
du -h --max-depth=1
du -ah directory/
du -h | sort -h
du -h --max-depth=1 | sort -hr | head -10
du -h --exclude=node_modules
du -h --exclude='*.log'
ncdu directory/
find . -type f -size +100M -exec ls -lh {} \;
du -csh dir1 dir2