915

I tried to obtain the size of a directory (containing directories and sub directories) by using the ls command with option l. It seems to work for files (ls -l file name), but if I try to get the size of a directory (for instance, ls -l /home), I get only 4096 bytes, although altogether it is much bigger.

  • 16
    1) Strictly speaking, you can't. Linux has directories, not folders. 2) There's a difference between the size of a directory (which is a special file holding inodes that point to other files), and the size of the contents of that directory. As others have pointed out, the du command provides the latter, which is what it appears you want. – jamesqf Feb 19 '15 at 18:27
  • 10
    as you seem to be new, I'll just point out the helpful -h option you can add to the -l option (i.e. ls -lh) to get the sizes of files to be printed out in human-friendly notation like 1.1M instead of 1130301. The "h" in the du -hs command that @sam gave as the answer for your question about directories also means "human-readable", and it also appears in df -h which shows the human readable amounts of used and free space on disk. – msouth Feb 20 '15 at 5:44
  • 1
    @jamesqf What's the difference between directory and folder? – v.shashenko May 23 '18 at 12:21
  • 3
    @jamesqf So no difference. Maybe only for people who enjoy thinking they are smarter if they choose unneeded complication. Things don't need to be complex when unnecessary. – v.shashenko May 26 '18 at 9:36

16 Answers 16

1300

du -sh file_path

Explanation

  • du (disc usage) command estimates file_path space usage
  • The options -sh are (from man du):

      -s, --summarize
             display only a total for each argument
    
      -h, --human-readable
             print sizes in human readable format (e.g., 1K 234M 2G)
    

    To check more than one directory and see the total, use du -sch:

      -c, --total
             produce a grand total
    
  • 37
    ...unless you have hardlinks ;-) stackoverflow.com/questions/19951883/… – Rmano Feb 20 '15 at 10:31
  • 1
    thanks @terdon, I meant to come back to add the argument's explanations but you got them first. – sam Feb 20 '15 at 16:41
  • I read this as ls -s -h; for some reason the format hides the du -sh for me :) – Nick May 23 '16 at 20:03
  • 8
    This is the kind of answer that I love <3 It is summarized and a kind of introduction to the command du and also you give the way to search for more details man du ... – user171470 Jun 5 '16 at 8:19
  • was using ls, totally forgot about this command. Thanks ! – Pini Cheyni Dec 22 '16 at 8:13
285

Just use the du command:

du -sh -- *

will give you the cumulative disk usage of all non-hidden directories, files etc in the current directory in human-readable format.

You can use the df command to know the free space in the filesystem containing the directory:

df -h .
  • 4
    du -sh * starts throwing "unknown option" errors if any of the files in that dir begin with a dash. Safer to do du -sh -- * – mpen Mar 1 '16 at 23:07
  • 1
    du -sh * doesn't show memory usages of hidden folders – Prashant Prabhakar Singh Oct 18 '16 at 13:00
  • 2
    du -sh -- * .* to include dotfiles. This is useful to include a possibly large .git directory, for example. Alternatively in zsh you can setopt globdots to glob dotfiles by default. – cbarrick Nov 29 '16 at 3:13
  • df is what i wanted, not du. Thanks! – Nik-Lz Jun 8 '17 at 16:39
  • What does the -- do? I know it applies to shell built-ins to end option arguments, but du is not a built-in, and I don't see this usage documented for du: linux.die.net/man/1/du – flow2k Jan 10 at 5:16
162

du is your friend. If you just want to know the total size of a directory then jump into it and run:

du -hs

If you also would like to know which sub-folders take up how much disk space?! You could extend this command to:

du -h --max-depth=1 | sort -hr

which will give you the size of all sub-folders (level 1). The output will be sorted (largest folder on top).

  • It seems on some (perhaps older?) versions of linux, sort does not have an h switch, and therefore the next best command I could find is: du -c --max-depth=1 | sort -rn – richhallstoke Jul 13 '16 at 9:41
  • @richhallstoke if you use ncdu the files are sorted by descending size by default. – Armfoot Feb 3 '18 at 6:35
  • 1
    +1 for the "| sort -hr" – afranques Mar 16 '18 at 19:42
  • This answer is much more clear on how to get size of nested folders – Daria Sep 17 '18 at 7:05
41

du can be complicated to use since you have to seemingly pass 100 arguments to get decent output. And figuring out the size of hidden folders is even tougher.

Make your life easy and use ncdu.

ncdu

You get per folder summaries that are easily browsable.

  • 5
    This should be the correct answer, at least for those who can install software on the system. Unfortunately I don't think most people will scroll down far enough to see this. – DavidR Aug 19 '17 at 15:16
  • @RickyNotaro-Garcia Nope, this ignores hidden objects and hangs on large directories. It may be possible that there is an OK solution with a dozen pipes, but why waste your life. – Teque5 Feb 8 '18 at 21:16
  • @RickyNotaro-Garcia Read my whole comment: your attempt ignores hidden objects and hangs on large directories. – Teque5 Feb 9 '18 at 2:48
  • 1
    ncdu is great, i always searching for this command when forget. It's fast, easy to navigate and helps to find big folders easily. FYI, it's available for macOS too and probably all linux machines. – Lukas Apr 10 '18 at 8:03
29

Others have mentioned du, but I would also like to mention Ncdu -- which is an ncurses version of du and provides interactivity: You can explore the directory hierarchy directly and see the sizes of subdirectories.

24

The du command shows the disk usage of the file.

The -h option shows results in human-readable form (e.g., 4k, 5M, 3G).

du -h (file name)
19

All of the above examples will tell you the size of the data on disk (i.e. the amount of disk space a particular file is using, which is usually larger than the actual file size). There are some situations where these will not give you an accurate report, if the data is not actually stored on this particular disk and only inode references exist.

In your example, you have used ls -l on a single file, which will have returned the file's actual size, NOT its size on disk.

If you want to know the actual file sizes, add the -b option to du.

du -csbh .
  • Yes. I'm using sdfs which compresses & dedups the files, so I couldn't figure out why it was reporting such low numbers. The actual size of the files with ls can be found by using: du -b – Ryan Shillington Oct 3 '16 at 22:31
12

personally I think this is best, if you don't want to use ncdu

# du -sh ./*
10
df -h .; du -sh -- * | sort -hr

This shows how much disk space you have left on the current drive and then tells you how much every file/directory takes up. e.g.,

Filesystem      Size  Used Avail Use% Mounted on
/dev/sdb2       206G  167G   29G  86% /
115M    node_modules
2.1M    examples
68K     src
4.0K    webpack.config.js
4.0K    README.md
4.0K    package.json
  • FYI, it seems to report the size-on-disk. i.e., it'll probably be padded to the nearest 4KB. – mpen Jun 15 '16 at 15:51
7

I use this command as root:

sudo ls -1d */ | sudo xargs -I{} du {} -sh && sudo du -sh
6

find all files under current directory recursively and sum up their size:

find -type f -print0 | xargs -0 stat --print='%s\n' | awk '{total+=$1} END {print total}'
  • I would use -not -type d to sum not only sizes of ordinary files (-type f) but also sizes of symbolic links and so on. – anton_rh Sep 24 '18 at 11:08
6

Here is a function for your .bash_aliases

# du with mount exclude and sort
function dusort () {
    DIR=$(echo $1 | sed 's#\/$##')
    du -scxh $(mount | awk '{print $3}' | sort | uniq \
     | sed 's#/# --  exclude=/#') $DIR/* | sort -h
}

sample output:

$ dusort /
...
0       /mnt  
0       /sbin
0       /srv
4,0K    /tmp
728K    /home
23M     /etc
169M    /boot  
528M    /root
1,4G    /usr
3,3G    /var
4,3G    /opt
9,6G    total

for subdirs:

$ dusort .
$ dusort /var/log/
4

One more variant:

du -h --max-dep=1
3

You can use

du -sh directory/

and

du -sh filename

to know the space occupied by the folder or file.

df -h

will show the disk usage in human readable format -h does that.

There is also a gui based program called Disk Usage Analyzer.

3

Here is a POSIX script that will work with:

  • A file
  • Files
  • A directory
  • Directories
#!/bin/sh
ls -ARgo "$@" | awk '{q += $3} END {print q}'

Source

2

Note that du prints the space that a directory occupy on the media which is usually bigger than just the total size of all files in the directory, because du takes into account the size of all auxiliary information that is stored on the media to organize the directory in compliance with file system format.

If the file system is compressible, then du may output even smaller number than the total size of all files, because files may be internally compressed by the file system and so they take less space on the media than just uncompressed information they contain. Same if there are sparse files.

if there are hard links in the directory, then du may print smaller value as well because several different files in the directory refer the same data on the media.

To get the straightforward total size of all files in the directory, the following one-line shell expression can be used (assuming a GNU system):

find . ! -type d -print0 | xargs -r0 stat -c %s | paste -sd+ - | bc

or even shorter:

find . ! -type d -printf '%s\n' | paste -sd+ - | bc

It just sums sizes of all non-directory files in the directory (and its subdirectories recursively) one by one. Note that for symlinks, it reports the size of the symlink (not of the file the symlink points to).

  • @Stéphane Chazelas, thank you. I updated my answer. – anton_rh Sep 24 '18 at 12:18

protected by Kusalananda Aug 31 '17 at 11:48

Thank you for your interest in this question. Because it has attracted low-quality or spam answers that had to be removed, posting an answer now requires 10 reputation on this site (the association bonus does not count).

Would you like to answer one of these unanswered questions instead?

Not the answer you're looking for? Browse other questions tagged or ask your own question.