Sometime it is necessary to find out what file(s) or directories is eating up all disk space. Further it may be necessary to find out it at particular location such as /tmp or /var or /home etc.
There is no simple command available to find out the largest files/directories on a Linux/UNIX/BSD filesystem. However, combination of following three commands (using pipes) you can easily find out list of largest files:
- du : Estimate file space usage
- sort : Sort lines of text files or given input data
- head : Output the first part of files i.e. to display first 10 largest file
Here is what you need to type at shell prompt to find out top 10 largest file/directories is taking up the most space in a /var directory/file system:
# du -a /var | sort -n -r | head -n 10
Output:
1008372 /var 313236 /var/www 253964 /var/log 192544 /var/lib 152628 /var/spool 152508 /var/spool/squid 136524 /var/spool/squid/00 95736 /var/log/mrtg.log 74688 /var/log/squid 62544 /var/cache
If you want more human readable output try:
# du -ks /var | sort -n -r | head -n 10
Where,
- -a : Include all files, not just directories (du command)
- -h : Human readable format
- -n : Numeric sort (sort command)
- -r : Reverse the result of comparisons (sort command)
- -n 10 : Display 10 largest file. If you want 20 largest file replace 10 with 20. (head command)
Updated for accuracy!
Featured Articles:
- 20 Linux System Monitoring Tools Every SysAdmin Should Know
- 20 Linux Server Hardening Security Tips
- My 10 UNIX Command Line Mistakes
- Linux: 20 Iptables Examples For New SysAdmins

- 25 PHP Security Best Practices For Sys Admins
- The Novice Guide To Buying A Linux Laptop
- 10 Greatest Open Source Software Of 2009
- Top 5 Email Client For Linux, Mac OS X, and Windows Users
- Top 20 OpenSSH Server Best Security Practices
- Top 10 Open Source Web-Based Project Management Software
- Top 5 Linux Video Editor Software
Facebook it - Tweet it - Print it -


{ 29 comments… read them below or add one }
Great, but what if I only want the largest files and not the directories?
To find out largest file only use command ls as follows in current directory:
ls -lSh . | head -5
Output:
-rw-r–r– 1 vivek vivek 267M 2004-08-04 15:37 WindowsXP-KB835935-SP2-ENU.exe
-rw-r–r– 1 vivek vivek 96M 2005-12-30 14:03 VMware-workstation-5.5.1-19175.tar.gz
ls -lSh /bin | head -5
You can also use find command but not du:
find /var -type f -ls | sort -k 7 -r -n | head -10
Hope this helps
And yes to find the smallest files use command:
ls -lSr /var
Or use find command with -size flag.
find / -type f -size +20000k -exec ls -lh {} ; | awk ‘{ print $8 “: ” $5 }’
Read man page of find for more info.
“find / -type f -size +20000k -exec ls -lh {} ; | awk ‘{ print $8 “: ” $5 }’”
needs to have the exec altered
find / -type f -size +20000k -exec ls -lh {} \; | awk ‘{ print $8 “: ” $5 }’
Also, I find this output easier to read
find . -type f -size +20000k -exec ls -lh {} \; | awk ‘{print $5″: “$8}’
How do I can list all the files in several directories and at the end write the totat of all the files and directories.I’m using the du command as fallow:
du -sh /public/base/sites/F*/*20070115*
this command give me the size of all the files but not the global total.
can somebody help me. please write me. john_fernandez@verizon.com.do
“If you want more human readable output try:
# du -ha /var | sort -n -r | head -n 10″
Im pretty sure that this will put 999kb above 1gb so I don’t think that this works.
This does not work.
# du -ha /var | sort -n -r | head -n 10″
as Joe says this ignores files over 1gb
You could try this, gives a human readable output in MB
find . -type f | xargs ls -s | sort -rn | awk '{size=$1/1024; printf("%dMb %s\n", size,$2);}' | headHuman readable version:
for X in $(du -s * | sort -nr | cut -f 2); do du -hs $X ; done
If you set du to human readable I think it will not sort the way you really want.
For the above problems. I would like to find a way to list only the last level directories’ sizes.
(I want to filter somehow this:
/home
/home/user
/home/user/mail
I just want to see the lasts of the tree!)
TIA!
–
R
this is what i use.
for i in G M K; do du -ah | grep [0-9]$i | sort -nr -k 1; done | head -n 11find . -type f -print0| xargs -0 ls -s | sort -rn | awk ‘{size=$1/1024; printf(“%dMb %s\n”, size,$2);}’ | head
! -print0 for filenames with spaces …
(and xargs -0 combined)
No wonder windows rule
Yeah you just go ahead and wait the 3 hours this search would take on Windows.
How about the 3 hours it takes to read through a bunch of unexplained programming nonsense. I swear half of the time all Linux guys do is insult other users….Example, the first listing is great as it begins to explain what the flags do, but I have no idea were to put some of them, pipes are not explained…ect
Winfan, I read this page wondering how to do these things in Windows — can you post instructions? Thanks!
This may vary depending on the version of Windows you’re using, but the basic procedure is: open the find/search window, go to the advanced options, and there will be an option there to enter in a size parameter. Simple.
In XP, press F3 or go Start->Search. Choose “All files and folders”, then “More advanced options”, then “What size is it?”, then specify a size.
thanks !!!!!!!!!!!!!!!!!
great job !!!!!!!!!!!
@winfan… how do you do this in windows? you don’t :P
c:\>dir /S /O-S | more
The simple dir /S command from c:\ will give you all files and directories from c:\ all the way through the drive and will sort from largest to smallest running through each directory. You can filter using /A if you’d like to restrict by hidden, system, archive files, read only files etc. and passing the output to another windows command if you need to further restrict or search in the files for something like “show me all the files on my hard drive over 6MB that contain the word ‘log’ from largest to smallest.”
/O will Specify the sort order for the files with the S after it sorting by file size (smallest first) putting the – in front of the S reverses the order.
| more – you’re a unix dude, you should know what this means…
But if someone is doing some cleanup through their harddrive, this is the simple command I’d start with.
Just a note about the cockyness or us Unix admins (as I happen to be one now)
Not everyone that uses windows started using it with a mouse kid!!! Also not everyone who prefers windows is not cross-platform… We were running 64 bit clustered NT boxes on RISC processors at Digital Equipment Corporation with failover and failback in 1996 brother. Don’t believe me? Find a really old copy of Windows NT ver 3.51 open it and you’ll see two folders NT and Alpha.
The Department of Veterans Affairs had no problems with ever needing to reboot a “lousy unreliable windows box” because the Intel platform itself was the problem, not windows. We ran Alpha on 64 bit RISC processors and it was just as reliable as any Unix box or Mainframe we had. I had a Jensen Alpha running an exchange server for 5 years, and we only rebooted it every 6 months for giggles…
Windows machines are made to be used by the masses which means more dumbasses can kinda run one. A good Admin is a good Admin, no matter what platform. Be nice and be helpful or don’t post.
Notafan wrote:
@winfan… how do you do this in windows? you don’t :P
Well, actually, there *is* cygwin (unix commands for Windows systems)
http://www.cygwin.com/
I find the following works rather well…
du -xak . | sort -n | awk '{size=$1/1024; path=""; for (i=2; i 50) { printf("%dMb %s\n", size,path); } }'It lists all files or directories bigger than 50MB (just change size>50 to alter that) in the current directory (change the “.” to a directory path to specify another one) in a friendly, human-readable way and happily plays with spaces (I used it on an NTFS mount in fact).
I get a syntax error when coptying and pasting this command
Same here…
I found this one the simplest one.
ls -lSh . | head -5
I have learnt a lot from your posts
thanks alot and keep it up.
ls -lR | sort -nr +4 -5 | head
Thanks heaps for this. It saved me lot of time.