How to sort the output of `ls`?
Is it possible to view this output sorted with titlepage_1.pdf before titlepage_19.pdf?
$ ls
allTitlepage.pdf titlepage_12.pdf titlepage_19.tex titlepage_26.pdf titlepage_32.tex titlepage_4.tex
allTitlepage.tex titlepage_12.tex titlepage_1.pdf titlepage_26.tex titlepage_33.pdf titlepage_5.pdf
assignment.pdf titlepage_13.pdf titlepage_1.tex titlepage_27.pdf titlepage_34.pdf titlepage_5.tex
assignment.tex titlepage_13.tex titlepage_20.pdf titlepage_27.tex titlepage_34.tex titlepage_6.pdf
graphicsAssignment2.pdf titlepage_14.pdf titlepage_20.tex titlepage_28.pdf titlepage_35.pdf titlepage_6.tex
graphicsAssignment2.tex titlepage_14.tex titlepage_21.pdf titlepage_28.tex titlepage_35.tex titlepage_7.pdf
README.md titlepage_15.pdf titlepage_21.tex titlepage_29.pdf titlepage_36.pdf titlepage_7.tex
thesisTitlepage.pdf titlepage_15.tex titlepage_22.pdf titlepage_29.tex titlepage_36.tex titlepage_8.pdf
thesisTitlepage.tex titlepage_16.pdf titlepage_22.tex titlepage_2.pdf titlepage_37.pdf titlepage_8.tex
titlepage_0.pdf titlepage_16.tex titlepage_23.pdf titlepage_2.tex titlepage_37.tex titlepage_9.pdf
titlepage_0.tex titlepage_17.pdf titlepage_23.tex titlepage_30.pdf titlepage_38.pdf titlepage_9.tex
titlepage_10.pdf titlepage_17.tex titlepage_24.pdf titlepage_30.tex titlepage_38.tex titlepage_one.pdf
titlepage_10.tex titlepage_18.pdf titlepage_24.tex titlepage_31.pdf titlepage_3.pdf titlepage_one.tex
titlepage_11.pdf titlepage_18.tex titlepage_25.pdf titlepage_31.tex titlepage_3.tex titlepage_two.tex
titlepage_11.tex titlepage_19.pdf titlepage_25.tex titlepage_32.pdf titlepage_4.pdf
Solution 1:
Use the switch -v [natural sort of (version) numbers within text]
ls -v
Solution 2:
The output is sorted. According to the ls
manpage:
Sort entries alphabetically if none of -cftuvSUX nor --sort is specified.
But if you want to go further, you have at least two options:
Option 1 - ls
sort switches
man ls
tells you about a number of switches you can use to sort, specifically, the ls man page says:
none (-U), size (-S), time (-t), version (-v), extension (-X)
In your case, you want "version" sort (-v). Be careful, though, since this will also sort anything that has a blahblah-X.Y.Z-A
arrangement which may not be entirely what you want. See also GNU's explanation of version sort.
Option 2 - Pipes to sorting commands
You could use a pipe |
to send the output to another command, for example the command sort
which you could use to sort in a number of other ways, as in ls -1 | sort -n
which is useful if you have numbered files. The -1
switch ensures that the output is one-line-per-file.
Equally, you can manipulate the output to aid with sorting by using things like sed
or awk
.
There are plenty of ways to answer this sort of* question. You may find a linux shell tutorial helpful.
*(See what I did there? :-p)
Solution 3:
As already pointed out in a comment, the output is already sorted, but by characters, not numbers.
You may want to pipe the output of ls
through sort
which has a switch to sort by numbers within strings:
ls | sort --version-sort
From the manpage:
-V, --version-sort natural sort of (version) numbers within text
Downside: When we issue ls
then it outputs the files in a table with as many columns as fit on the current screen (just like you showed in your post). But when ls
notices that its output is redirected to a file or to a pipe (as in ls | sort
) then ls
prints the files in just one column because it then assumes the output is to be processed line-by-line (aka file-by-file) by some other program (like sort
). So the output of ls | sort -V
will be in one column instead of in a table with multiple columns. See @vijay's simple but perfect answer for how to avoid that.