I want to get a sorted list of files. Files have the following naming convention:
DATENUMBER.txt
(without spaces).
E.g., file 3
on 2015-12-09
looks like: 201512093.txt
The version sort
option of ls
doesn't help me:
ls -v:
201512183.txt
201512184.txt
201512188.txt
201512191.txt
201512195.txt
201512199.txt
2015121810.txt
2015121813.txt
2015121910.txt
2015121911.txt
2015121932.txt
sort -V
, --key=1.[number]
do not work too as I have different filename length.
As I have no delimeter between the date and the number, sort -t, -k
does not work too.
As one can see, I need to sort list of files by first 8 symbols in filenames, and after that, by the other part of line.
The expected output:
201512183.txt
201512184.txt
201512188.txt
2015121810.txt
2015121813.txt
201512191.txt
201512195.txt
201512199.txt
2015121910.txt
2015121911.txt
2015121932.txt
How can I do it (having linux with bash)? Thanks.
This will do the sort:
sort -k1.1,1.8 -k1.9n
That defines two keys, the first one being a fixed-length 8-character key (field one, characters 1 through 8), and the secondary key being a numeric key starting at field one character 9 (and extending to the end of the line).
Numeric sorting uses whatever number it finds at the beginning of the key, so you don't need to get more sophisticated. But if you want to be more precise, you could tell sort
to use .
to delimit fields, and then use three keys:
sort -t. -k1.1,1.8 -k1.9,1n -k2
You might need this with a POSIX-standard sort
utility, if your filenames have varying extensions and you want the extensions to affect the sort. GNU sort
(used on Linux) appears to use the entire key in a numeric sort, but the POSIX standard suggests that a numeric sort key consists only of the numeric part.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With