59

By default the ls command sorts just by filename, but I want directories to appear before other file types. I might even want files to be sorted by extension, like the way Windows explorer sorts by the type column. Is there a way to do something similar with ls?

7 Answers 7

62

I think the complete answer is more of a combination of the above.

-X (later --sort=extension) has been supported on Linux since at least FC3 and will sort based on extension. --group-directories-first was added more recently (maybe around FC8?). However, combining the two doesn't seem to work (at least on FC8).

The primary issue seems to be with the use of singular primary sort keys. See this mailing list discussion for some insight into it.

3
  • 6
    I know this post is rather old, but to others coming here from e.g. Google (like I did): The combination of --sort=extension and --group-directories-first (or only --group-directories) works fine for me on Ubuntu 12.10. Worth a shot on your machine too! =) Mar 29, 2013 at 11:27
  • 1
    Yes no problem combining -X / --sort=extension with --group-directories-first and anything else I've tried on modern Linux distros. The OP is referring to Fedora Core 8 (released 2007) so chances are any such problems are in the distant past.
    – mattst
    Mar 8, 2019 at 20:42
  • I used ls -p -1v -x --group-directories-first and got the following order test21.txt test22.txt test22.webp test23.txt is there a way to combine -1v and -x options? May 15, 2020 at 3:39
28

On Linux,

$ ls --group-directories-first
2
  • 1
    upvoted IN SPITE of the rtfm comment. May 14, 2016 at 22:14
  • 2
    gls --group-directories-first on Mac if you install GNU Core utils over homebrew
    – To Kra
    Mar 1, 2017 at 9:32
21

-X is the option you're looking for:

ls -lX
18

On bash, this will sort of work:

$ ls | rev | sort | rev

From man rev:

 The rev utility copies the specified files to the standard output,
 reversing the order of characters in every line.  If no files are speci-
 fied, the standard input is read.

So 1. ls gives its output, with any flags you want 2. each line is reversed 3. then they're sorted 4. and reversed again 5. like this:

  1. like this:
  2. each line is reversed
  3. then they're sorted
  4. and reversed again So
  5. ls gives its output, with any flags you want

Or, more to the point, as below. They're sorted by last character, then next-to-last, etc. All the .rtf files, for example, are listed together, after a .save file and another file with no extension whose name ends in 'e'. Then come .png files, and so on. This will also work with ls -l, because the extension is normally the last thing on the line (exceptions if you have lines like "tmp@ -> /home/jones/tmp", where links are followed by their targets).

 $ ls | rev|sort|rev
 cslu1
 ls.mp2
 ls.mp3
 ls.mp4
 trees_110214-15
 PAT
 CSLU
 Proxy Form.doc
 finannbyid
 toannbyid
 101209ssi.txt.save
 to_annotate_size
 Matas-time-by-week-integration2.rtf
 cyp3.rtf
 data-dir-scan.perl.doc.rtf
 whence-r21-numid.rtf
 platypus.rtf
 Screen shot 2011-01-21 at 2.17.50 PM.png
 emacs print help.png
 log
 new_month_log
 special
 Google-ngram-critique.html
 perl_path.html
 nl
 DWE_BEN_89808.2.ann
 foo
 d.o.foo
 100811_from_iMac_Documents_in_dock.zip
 to-palikir.zip
 tmp
 file-cleanup
 bar
 data-scan-docs
 cmp-mg-ann-numids
 finished_numids
 to_annotate_numids
 manls.ps
 Mike_address_ticket
 cyp2.out
 cyp3.out
 locate-cyp.out
 manls.out
 DWE_BEN_89808.2.text
 tag2.txt
 l2.txt
 du-h-d3.txt
 finished_ann_numids_110407_1714.txt
 finished_all_numids_110407_1718.txt
 data-dir-scan.perl.doc.txt
 whence-r21-numid.txt
 finannid.txt
 toannid.txt
 b9-workspace-anndiff.txt
 tag.txt
 duh.txt
 d.o-mail.txt
 safextn.txt
 mg3longhdr.txt
 finished_numids.txt
 41692-langnames.txt
 TimeAnnotationGuidelines.txt
 41langs.txt
 thing4-homedir-links.txt
 bnlinks.txt
 grants.txt
 mata-file-reports.txt
 logx.txt
 logx
 b9-workspace-anndiff.txt~
 bnlinks.txt~ 
5
  • 1
    Wouldn't list directories first, though.
    – CarlF
    Jun 3, 2011 at 21:29
  • it will if you ls -F Jun 4, 2011 at 14:55
  • +1 for the effort...
    – varun
    Apr 3, 2018 at 9:12
  • @glennjackman that's better. should be in the answer.
    – voices
    Sep 9, 2018 at 2:47
  • It would be nice (especially with -F) if piping it through rev & sort didn't strip the colour (-G).
    – voices
    Sep 9, 2018 at 2:48
3

If you're running on Linux, GNU ls supports the --sort option:-

ls --sort=extension
1
3

If you're not on linux,

ls -l |sort -d -k 1.1,1.1r -k 9 |awk '{print $9}'

should sort directories first (let me know if I'm wrong). Doesn't sort by extension, though: you have to make the awk statement a lot busier if you want to do that ...


To also make it work with names containing spaces, I would probably replace the awk with something like sed -E -e 's/([^ ]+[ ]+){8}//' to strip out the first 8 fields instead of printing the 9th

6
  • actually, I'm pretty sure this will work on linux, too, but as others have stated you have some built-in support there. Oct 27, 2009 at 5:06
  • 1
    Works on a Mac. Note that if you have CLICOLOR turned on this will remove the coloring.
    – eykanal
    Mar 30, 2011 at 14:36
  • 1
    will give incorrect results for filenames with spaces. Jun 4, 2011 at 14:53
  • @glenn, you are right ... if this was a concern I would probably replace the awk with something like sed -E -e 's/([^ ]+[ ]+){8}//' to strip out the first 8 fields instead of printing the 9th Jun 4, 2011 at 18:29
  • ls -l |sort -d -k 1.1,1.1r -k 9 | cut -c 50-
    – nohillside
    Feb 10, 2012 at 20:51
0

I added to my .bashrc (linux) the line

alias lx = "ls -X"

that way I just type lx and get it sorted by extension.

6
  • So the answer to the question is use ls -X :)
    – Andrew
    Jan 23, 2013 at 20:23
  • Not what was asked for May 14, 2016 at 21:05
  • @SridharSarnobat I personnally think his answers was totally on topic. And following his suggestion, I have added lx as a bash alias for having ls sorting by file extension and then name: approximately the exact label for this question. Feb 9, 2020 at 8:59
  • Does it group directories and files separately? I think that was what I was looking for. Feb 9, 2020 at 17:05
  • 1
    @ClareMacrae "know" would not be the correct term :-) I could have used "this" instead of "his", you're right Mar 17, 2021 at 10:48

You must log in to answer this question.

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