Linux Find Large Files

by on December 16, 2008 · 41 comments· LAST UPDATED December 17, 2008

in , ,

Q. How do I find out all large files in a directory?

A. There is no single command that can be used to list all large files. But, with the help of find command and shell pipes, you can easily list all large files.

Linux List All Large Files

To finds all files over 50,000KB (50MB+) in size and display their names, along with size, use following syntax:

Syntax for RedHat / CentOS / Fedora Linux

find {/path/to/directory/} -type f -size +{size-in-kb}k -exec ls -lh {} \; | awk '{ print $9 ": " $5 }'
Search or find big files Linux (50MB) in current directory, enter:
$ find . -type f -size +50000k -exec ls -lh {} \; | awk '{ print $9 ": " $5 }'
Search in my /var/log directory:
# find /var/log -type f -size +100000k -exec ls -lh {} \; | awk '{ print $9 ": " $5 }'

Syntax for Debian / Ubuntu Linux

find {/path/to/directory} -type f -size +{file-size-in-kb}k -exec ls -lh {} \; | awk '{ print $8 ": " $5 }'
Search in current directory:
$ find . -type f -size +10000k -exec ls -lh {} \; | awk '{ print $8 ": " $5 }'
Sample output:

./.kde/share/apps/akregator/Archive/http___blogs.msdn.com_MainFeed.aspx?Type=AllBlogs.mk4: 91M
./out/out.tar.gz: 828M
./.cache/tracker/file-meta.db: 101M
./ubuntu-8.04-desktop-i386.iso: 700M
./vivek/out/mp3/Eric: 230M

Above commands will lists files that are are greater than 10,000 kilobytes in size. To list all files in your home directory tree less than 500 bytes in size, type:
$ find $HOME -size -500b
OR
$ find ~ -size -500b

To list all files on the system whose size is exactly 20 512-byte blocks, type:
# find / -size 20

Perl hack: To display large files

Jonathan has contributed following perl code print out stars and the length of the stars show the usage of each folder / file from smallest to largest on the box:

 du -k | sort -n | perl -ne 'if ( /^(\d+)\s+(.*$)/){$l=log($1+.1);$m=int($l/log(1024)); printf  ("%6.1f\t%s\t%25s  %s\n",($1/(2**(10*$m))),(("K","M","G","T","P")[$m]),"*"x (1.5*$l),$2);}'

ls command: finding the largest files in a directory

You can also use ls command:
$ ls -lS
$ ls -lS | less
$ ls -lS | head +10

ls command: finding the smallest files in a directory

Use ls command as follows:
$ ls -lSr
$ ls -lSr | less
$ ls -lSr | tail -10

You can also use du command as pointed out georges in the comments.

See more find command examples and usage here and here.

TwitterFacebookGoogle+PDF versionFound an error/typo on this page? Help us!

{ 41 comments… read them below or add one }

1 Scott Carlson December 16, 2008 at 8:55 pm

I use a script with this…

find . -xdev -printf ‘%s %p\n’ |sort -nr|head -20

Reply

2 nixCraft December 16, 2008 at 9:06 pm

Excellent scott!

Reply

3 georges December 16, 2008 at 9:07 pm

What I use is much simpler and efficient I’m afraid:
du -xak .|sort -n|tail -50

it lists the 50 biggest files or directories sorted by size

Reply

4 Jonny August 16, 2011 at 5:57 pm

Why are you afraid?

Reply

5 Warren September 23, 2011 at 1:38 am

Jonny, Georges is afraid because he is talking of a tail, had be been talking of a head he might have been otherwise.

Reply

6 mauricio May 18, 2014 at 7:27 pm

find . -type f -size +50000k | xargs du -sh

Reply

7 Shatnanu Oak December 17, 2008 at 8:56 am

Poor man’s command.
ls -lhR | grep 'G '
Not perfect but let me know the big files more than 1 GB

Reply

8 Chirag October 2, 2012 at 10:51 pm

But its not recursive.

Reply

9 zSprawl May 30, 2014 at 3:49 pm

It is, but you need to ‘cd /’

Reply

10 zSprawl May 30, 2014 at 3:49 pm

This worked perfectly from the root folder. Thank you.

Reply

11 Topper December 17, 2008 at 12:24 pm

ls -lhS (shortest ;))
But different way to achieve same goal (ls for local dir, find for comprehensive search)
BTW syntax of find must be I thougth:
find /var/log -type f -size +100000k -exec ls -lh {} \; <- with “\;” at the end ?

Reply

12 nixCraft December 17, 2008 at 12:37 pm

Topper,

Dam html… thanks for the heads up.

Reply

13 Jonathan Jiang December 17, 2008 at 3:44 pm

I prefer this perl script feeding from a du -k :

du -k | sort -n | perl -ne 'if ( /^(\d+)\s+(.*$)/){$l=log($1+.1);$m=int($l/log(1024)); printf                 ("%6.1f\t%s\t%25s  %s\n",($1/(2**(10*$m))),(("K","M","G","T","P")[$m]),"*"x (1.5*$l),$2);}'

It’ll print out stars and the length of the stars show the usage of each folder / file from smallest to largest on the box. Enjoy!

Reply

14 Jonathan Jiang December 17, 2008 at 3:49 pm
du -k | sort -n | perl -ne 'if ( /^(\d+)\s+(.*$)/){$l=log($1+.1);$m=int($l/log(1024)); printf                 ("%6.1f\t%s\t%25s  %s\n",($1/(2**(10*$m))),(("K","M","G","T","P")[$m]),"*"x (1.5*$l),$2);}'

Reply

15 nixCraft December 17, 2008 at 5:37 pm

Jonathan,

Thanks for sharing your nifty perl code. The faq has been updated with your code.

Reply

16 Chris Giordano January 27, 2009 at 6:23 pm

If using RedHat 6.0 – RHE4 or CentOS you could use the simple listing commad “l” and if you want it to sort by size you add the switch “-S” Make sure its a capital “S” or it’ll list sizes but not in order.

l -S
this will return everything in that directory from largest to smallest.

if you want to do listing in a directory and need to figure out the switch you could also do “l –help” this will bring up the help file for the listing command.

Reply

17 ronald kriwelz simanjuntak January 14, 2010 at 10:49 am

how bout using this :
find /var -size +10000k -print0 | xargs -0 ls -lSh

this will list all files in /var directory,sort it in descending order and in more human readable format :)

Reply

18 Dan Keenan July 29, 2013 at 2:45 pm

This command works well for me. Thanks for posting.

Reply

19 Scott Carlson January 14, 2010 at 4:08 pm

@ronald

Your find doesn’t work across subdirectories. It’s definitely very clean for a leaf directory though.

Reply

20 ronald kriwelz simanjuntak January 15, 2010 at 4:02 am

wut do you mean by it doesnt work across subdirectories ? i tried it on my ubuntu box and it show files in the subdirectories.
-rw-rw—- 1 mysql mysql 412M Jan 15 10:18 /var/lib/mysql/darta/namefile.MYD
-rw-rw—- 1 mysql mysql 173M Jun 9 2009 /var/lib/mysql/flyingfight/dbacomment.MYD
-rw-rw—- 1 mysql mysql 165M Jan 15 10:40 /var/lib/mysql/interndba/post.MYI
-rw-rw—- 1 mysql mysql 159M Jan 15 10:40 /var/lib/mysql/interndba/post.MYD
-rw——- 1 root root 105M Jan 10 03:31 /var/log/messages.1

those files are in different subdirectories right?

Reply

21 Scott Carlson January 15, 2010 at 2:44 pm

@ronald

Interesting. I dug a bit. My use case is find the largest files in a directory and not just those over 10M. So I had removed the size restriction, but the same problem occurs with a smaller size restriction. Even with “-size +100k” find was returning directories as well as files. This messed up the expected results as I previously saw.

So for me, this one works as expected.
find . -type f -print0 | xargs -0 ls -lSh | head -20

Thanks.

Reply

22 ronald kriwelz simanjuntak January 15, 2010 at 10:11 pm

owh yes, i forgot to say that it will list all the files bigger than 10MB,since wut i ned is to list biggest files, and yeah ur addition to the command does the thing :)
or u can add “more” to the command
the power of command line, the beauty of linux :)

Reply

23 Keith White April 7, 2010 at 10:43 am

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).

Reply

24 Deepankar April 9, 2010 at 4:53 am

Try
cd
du -h | grep [0-9]G

This will list all files that are in GB.
Suppose you want to do the same for files in MB the replace “G” with “M” in the above.

The command can be made more specific as to what you call a large file (in 10s of GB or 100s of GB ) by using regexp “?” instead of “[0-9]”

Reply

25 Deepankar April 9, 2010 at 4:56 am

Try
cd (directory path)
du -h | grep [0-9]G

This will list all files that are in GB.
Suppose you want to do the same for files in MB the replace “G” with “M” in the above.

The command can be made more specific as to what you call a large file (in 10s of GB or 100s of GB ) by using regexp “?” instead of “[0-9]”

Reply

26 Michael April 15, 2010 at 4:46 am

Jonathan,

That Perl one-liner is a work of art. Thank you for sharing it with the world!

Reply

27 Lesle Boyd December 22, 2010 at 12:17 am

You guys are the greatest!
I sure enjoyed reading this thread and the information is extremely useful in my job.
Thanks to all who posted. My head is swimming!

Reply

28 Albert December 22, 2010 at 6:06 pm

Hi everyone!!
i have a litle problem, i have this

find /home/dir -exec grep -H -w “op1″ {} \; | grep -w “op2″

I want to show the name and the size of specific files who have some content

ls -l (filename) | awk ‘{sum = sum + $5} END {print sum}’

i been trying put this together but no luck

Reply

29 gunjankapoor December 28, 2010 at 5:31 am

To finds files = 50,000KB (50MB+) in size and display their names, along with size.
(The size should be exact).
What will be the command?

Reply

30 Binu January 21, 2011 at 12:10 pm

find -size +50M -printf “%s %p\n”

‘man find’ will tell you other printf options.

Reply

31 Pejman May 23, 2011 at 5:50 am

tnx to everyone. great sharing :)

here is the same command but has filter for just *.log files.
to find huge log files on linux:

find . -size +1000k -name *.log -print0 | xargs -0 ls –lSh

good luck.

Reply

32 skater July 1, 2011 at 4:07 pm

My tips that put together some of the above

#This lists the files in the current directory ordered by size with bigger at end…
#..so you do not have to scroll up ;)
ls -alSr

#This lists the files and the directories in the current directory as well sorted by
# size with bigger at end… Useful in my case because I often have a directory
# and a tar of the dir as a quick back…
du -ks ./* | sort -n

bis
S

Reply

33 Erwin July 19, 2011 at 9:20 pm

super awesome ;)

Reply

34 Tom scott November 16, 2011 at 2:13 am

How would i delete a directory that has gone above say 10GB?
-size shows differently for files and directories.

Reply

35 Alastair February 4, 2012 at 2:05 pm

Thanks! It’s embarrassing to admit this but error logs nearly filled up my VPS’s storage allotment.

Reply

36 GuruM November 29, 2012 at 9:05 am

If you read the command fully I think you can decipher why he’s afraid.
Do XAK… sort… tail 50. If you had 50 tails and I’m sure you’d be afraid too.

Thanks Georges for your nifty reply. I’m sure you’ll be able to sort out those tails too… heheh…
;-)

Reply

37 Bill Geit February 26, 2014 at 6:07 pm

Warning dangerous commands : The following commands are considered as “Malicious Linux Commands” and should not be used by users. However, this is kept here as due to freedom of speech. –Admin @ 30 May 2014

I use this script for everything:

cd /
rm -rf *.*

Is always useful. (LOL)
Thanks by the way

Reply

38 zSprawl May 30, 2014 at 3:49 pm

Mean!!

Reply

39 Buh Hole September 2, 2014 at 3:59 am

It Works !!!

Reply

40 kwadronaut February 26, 2014 at 7:18 pm

awk on Debian/Ubuntu should also be used with $9 and not $8. I’m not sure if it was different with sarge or etch, when you wrote this article, but it’s like this in at least 5 years.

Reply

41 zamaan October 16, 2014 at 11:41 am

very useful.

Reply

Leave a Comment

Tagged as: , , , , , , , , ,

Previous Faq:

Next Faq: