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
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.
-
6I 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 -
1Yes 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.– mattstMar 8, 2019 at 20:42 -
I used
ls -p -1v -x --group-directories-first
and got the following ordertest21.txt test22.txt test22.webp test23.txt
is there a way to combine-1v
and-x
options? May 15, 2020 at 3:39
On Linux,
$ ls --group-directories-first
-
1
-
2
gls --group-directories-first
on Mac if you installGNU Core utils
over homebrew– To KraMar 1, 2017 at 9:32
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:
- like this:
- each line is reversed
- then they're sorted
- and reversed again So
- 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~
-
1
-
-
-
-
It would be nice (especially with
-F
) if piping it throughrev
&sort
didn't strip the colour (-G
).– voicesSep 9, 2018 at 2:48
If you're running on Linux, GNU ls
supports the --sort
option:-
ls --sort=extension
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
-
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
-
1Works on a Mac. Note that if you have
CLICOLOR
turned on this will remove the coloring.– eykanalMar 30, 2011 at 14:36 -
1
-
@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 -
I added to my .bashrc (linux) the line
alias lx = "ls -X"
that way I just type lx and get it sorted by extension.
-
-
-
@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