Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Using the bash sort command within variable-length filenames

I am trying to numerically sort a series of files output by the ls command which match the pattern either ABCDE1234A1789.RST.txt or ABCDE12345A1789.RST.txt by the '789' field.

In the example patterns above, ABCDE is the same for all files, 1234 or 12345 are digits that vary but are always either 4 or 5 digits in length. A1 is the same length for all files, but value can vary so unfortunately it can't be used as a delimiter. Everything after the first . is the same for all files. Something like:

ls -l *.RST.txt | sort -k +9.13 | awk '{print $9} ' > file-list.txt

will match the shorter filenames but not the longer ones because of the variable length of characters before the field I want to sort by.

Is there a way to accomplish sorting all files without first padding the shorter-length files to make them all the same length?

like image 933
Michael Meech Avatar asked Sep 04 '13 20:09

Michael Meech


People also ask

How do I sort files by length?

With right-click sort Another way to sort files in a given folder is by right-clicking on the body of the folder. A pop-up will appear. Here, click on “Sort by -> Size.” The files will be sorted accordingly.

How do you sort file names in Linux?

The easiest way to list files by name is simply to list them using the ls command. Listing files by name (alphanumeric order) is, after all, the default. You can choose the ls (no details) or ls -l (lots of details) to determine your view.

How do I sort a file in bash?

Bash Sort Files Alphabetically By default, the ls command lists files in ascending order. To reverse the sorting order, pass the -r flag to the ls -l command, like this: ls -lr . Passing the -r flag to the ls -l command applies to other examples in this tutorial.

Which command will read the data from file and sort it sort names txt?

SORT command is used to sort a file, arranging the records in a particular order. By default, the sort command sorts file assuming the contents are ASCII. Using options in the sort command can also be used to sort numerically. SORT command sorts the contents of a text file, line by line.


1 Answers

Perl to the rescue!

perl -e 'print "$_\n" for sort { substr($a, -11, 3) cmp substr($b, -11, 3) } glob "*.RST.txt"'

If your perl is more recent (5.10 or newer), you can shorten it to

perl -E 'say for sort { substr($a, -11, 3) cmp substr($b, -11, 3) } glob "*.RST.txt"'
like image 112
choroba Avatar answered Sep 29 '22 10:09

choroba