Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Sort files numerically in bash

I need to sort .flv files numerically and i was able to do it with the following command:

ls *\.flv | sort --version-sort -f

but with many files(hundreds) it's not sorting correctly.

ls *\.flv | sort --version-sort -f | tail -n 20
e680.flv
e681.flv
e682.flv
e683.flv
e684.flv
e685.flv
e686.flv
e687.flv
e688.flv
e689.flv
e690.flv
e691.flv
e692.flv
e693.flv
e694.flv
e695.flv
**e696.flv**
s572.flv
s602.flv
s654.flv

but the strange this is, if i'm ruining the command without "*.flv" it's working. i could use just ls but i have other file types in the folder.

ls | sort --version-sort -f | tail -n 20
e680.flv
e681.flv
e682.flv
e683.flv
e684.flv
e685.flv
e686.flv
e687.flv
e688.flv
e689.flv
e690.flv
e691.flv
e692.flv
e693.flv
e694.flv
e695.flv
e696.flv

what i've tried so far:

    ls | sort --version-sort -f | grep "flv"
    ls *.flv | sort --version-sort -f
    ls *\.flv | sort --version-sort -f
    ls *.flv | sort -f
like image 569
Crazy_Bash Avatar asked Nov 13 '12 12:11

Crazy_Bash


People also ask

How do I sort numerically in Linux?

How to sort by number. To sort by number pass the -n option to sort . This will sort from lowest number to highest number and write the result to standard output. Suppose a file exists with a list of items of clothing that has a number at the start of the line and needs to be sorted numerically.

How do I sort a text file numerically in Linux?

Sort a File Numerically To sort a file containing numeric data, use the -n flag with the command. By default, sort will arrange the data in ascending order. If you want to sort in descending order, reverse the arrangement using the -r option along with the -n flag in the command.

How do you sort files in shell script?

the -r flag is an option of the sort command which sorts the input file in reverse order i.e. descending order by default. Example: The input file is the same as mentioned above. 3. -n Option: To sort a file numerically used –n option.


2 Answers

I would try following code. Works on my testing scenario:

ls -1 *\.flv | sort -n -k1.2

The ls lists flv files 1 on each line, sort takes first (and only one) word on each line starting on second character (start of the number). Sorts numerically

like image 190
Kamil Šrot Avatar answered Nov 16 '22 02:11

Kamil Šrot


Given a folder with sequentially named files from 1.flv to 9999.flv

ls -v1 *.flv

will output:

1.flv
2.flv
...
10.flv
...
90.flv
...
100.flv
101.flv
...
9999.flv

From the man page:

    -v     natural sort of (version) numbers within text
    -1     list one file per line

For brevity, the two flags above can be clubbed together as -v1.

like image 29
ccpizza Avatar answered Nov 16 '22 00:11

ccpizza