I decided to write a very small disk usage reporting script that provides some extra information than does just using ‘du‘ directly. The script of course uses du, among other command line tools and parsing commands to generate the little report. It suits my needs for the moment. Hopefully others out there will also find it useful.
Firstly, here is the script output to give you an idea of how to execute it, what it does, and how it looks:
$ ./dux.bash /home/jbl /home/jbl Building extended du reports for /home/jbl in /home/jbl ... [du extended report]: 13G ./Personal 4.7G ./DATA 2.4G ./Pictures 1.4G ./Downloads Total (GB): 21.5 373M ./core 260M ./tmp 73M ./game-saves 37M ./new-music 33M ./new-books 32M ./vim-env 24M ./random-tools 15M ./stuff Total (MB): 847
The script takes two arguments, the directory you want to analyze, and the directory where you want to store the reports.
As you will see, the script provides me an at-a-glance look at the following characteristics of a particular directory structure:
- Grouping and separation of larger (GB sized) directories from smaller (MB sized) directories.
- Directories sorted by size in each group.
- Total sizes for each group of files and directories.
With this output I can see clearly which directories are causing the most contention, and how much of an impact they have compared to other directories.
The script is very crude, and probably needs some work and error correction (accounting for files off or root, etc.) It also creates some temporary text files (used to construct the report), which is the reason for the second argument to the script. However for now it’s doing what I need, so I figure it’s worth sharing. Here it is:
#!/bin/bash echo "Building extended du reports for $1 in $2 ..."; cd $1 du -sh $1/* > $2/du-output.txt cat $2/du-output.txt | egrep '([0-9][0-9]M)' > ~jbl/du-output-MB.txt cat $2/du-output.txt | egrep '[0-9]G'> ~jbl/du-output-GB.txt cat $2/du-output-MB.txt | sort -hr > $2/du-output-MB-sorted.txt cat $2/du-output-GB.txt | sort -hr > $2/du-output-GB-sorted.txt echo '[du extended report]:'; cat $2/du-output-GB-sorted.txt echo -ne "Total (GB): " && cat ~jbl/du-output-GB-sorted.txt | perl -pe 's/^(\d+\.+\d+|\d+)\w*.*/$1/g' | paste -sd+ | bc echo "" cat $2/du-output-MB-sorted.txt echo -ne "Total (MB): " && cat ~jbl/du-output-MB-sorted.txt | perl -pe 's/^(\d+\.+\d+|\d+)\w*.*/$1/g' | paste -sd+ | bc
I’m not sure what more I will need from it going forward, so it may not get much love in the way of improvements. Since it would be nice to have it on each system I’m using, I may convert it to a single script that has no need to generate temporary text files.
Nuff said! Hopefully you find either the script, or portions of it useful in some way!
For convenience, I’ve also added this script as a public gist so you can download dux.bash from github.