47

I'd like to sort all the directories/files in a specific directory based on their size (using du -sh "name").

I need to apply this command to all directories in my location, then sort them based on this result. How can I do that ?

1

6 Answers 6

72

With GNU sort and GNU du (which it appears you have, since you state you are using du's -h option):

du -sh -- *  | sort -rh  # Files and directories, or
du -sh -- */ | sort -rh  # Directories only

The output looks something like this:

22G     foo/
21G     bar/
5.4G    baz/
2.1G    qux/
1021M   wibble/
4.0K    wobble/
1
  • 1
    Note that if a file is hard linked in two or more directories, then the sizes of each directory reported by du depends on the order of the directories on the command line. Also, -h is available on other du implementations than GNU.
    – Kusalananda
    Apr 2, 2021 at 12:24
5

Sort by sizes (as unformatted numbers of kibibytes) and then turn those into human readable:

du -sk -- * | sort -nr | cut -f2 | xargs du -sh
1
  • 1
    This fails if the directory names contain whitespace.
    – Marco
    Dec 23, 2013 at 9:59
3

This is an improved version based on jabalv's answer. It works with a GNU as well as a BSD userland.

IFS='\n' du -sk -- * | sort -n | cut -f2 |
while read line ; do
  xargs du -sh "$line"
done

sample output:

4.0K  games
2.7M  local
6.7M  lib32
19M   sbin
152M  src
177M  include
321M  bin
2.2G  share
2.9G  lib

To reverse the sort order and list the largest files and directories first, use sort -nr.

1
  • (1) How is this “an improved version”? It still fails if the directory names contain whitespace. (2) Does  IFS='\n' do anything useful? (3) Does setting IFS at the point in your answer where you have set it have any effect on the execution? Apr 20, 2022 at 0:23
0

This improves on jabalv's answer, fixing the space in names issue:

du -sk -- * | sort -nr | awk -F '\t' '{print "\""$2"\""}' | xargs du -sh
1
  • 1
    OK, this fixes the problem for spaces in directory names.  It still fails for other whitespace.  I’ll admit that it is very hard to write complex commands that handle filenames that contain newlines correctly, but this also fails for names that contain tabs. … or quote characters (").  Also, before I fixed it, it could have failed for filenames beginning with - (hyphen/dash). … … … … … … … … … … … … … P.S. Please don’t refer to “the above answer”, as different people see the answers in different orders. Apr 18, 2022 at 18:23
0

As inspired by jabalv’s answer, sort by sizes (as unformatted numbers of kibibytes) and then turn those into human readable numbers — without running du a second time:

du -s -- * | sort -n | numfmt --from-unit=1024 --to=iec

or

du -s --block-size=1 -- * | sort -n | numfmt --to=iec
  • You can add the -k option to the first command line (i.e., du -sk) to specify that output should be in kibibytes, but this seems to be the default.
  • Use */ instead of * to list directories only, as in Chris Down’s answer.
  • Add the -r option to the sort command (i.e., sort -nr) if you want to sort from high to low.
  • Use --from-unit=1024 because du uses binary prefix notation (i.e., K=1024, M=220, etc.) by default.
  • Likewise, use --to=iec to output binary-prefix numbers.
  • This replaces the tabs in du’s output with spaces.  Add --padding=-7 to the numfmt command to get the output to look like it has tabs.  (I guess it is counting zero-based.)
    (--padding=7 (without the -) would right-justify the numbers.)
-2

This command should work:

sudo du -sh $(sudo ls) | sort -h

2
  • 3
    Can you explain the need for each sudo and why you're using ls? Note that this would break for anything containing spaces.
    – Kusalananda
    Apr 2, 2021 at 12:25
  • @Kusalananda there is no need for each sudo. I wrote that because sometimes I was denied access to run this command. I use ls to list all the directories and use them as input to the du command. But yes, you are absolutely correct, this would definitely break for directories with whitespaces.
    – Faizan
    Apr 3, 2021 at 6:47

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .