Сортировать файлы численно в Bash
Мне нужно отсортировать файлы.flv численно, и я смог сделать это с помощью следующей команды:
ls *\.flv | sort --version-sort -f
но со многими файлами (сотнями) это неправильно сортирует.
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
но это странно, если я разрушаю команду без "*.flv"
работает. я мог бы использовать только ls, но у меня есть другие типы файлов в папке.
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
что я пробовал до сих пор:
ls | sort --version-sort -f | grep "flv"
ls *.flv | sort --version-sort -f
ls *\.flv | sort --version-sort -f
ls *.flv | sort -f
3 ответа
Я бы попробовал следующий код. Работает по моему сценарию тестирования:
ls -1 *\.flv | sort -n -k1.2
ls
перечисляет FLV файлы 1 в каждой строке, sort
занимает первое (и только одно) слово в каждой строке, начиная со второго символа (начало числа). Сортировка по численности
Имеется папка с последовательно именованными файлами из 1.flv
в 9999.flv
ls -v1 *.flv
будет выводить:
1.flv
2.flv
...
10.flv
...
90.flv
...
100.flv
101.flv
...
9999.flv
Со страницы руководства:
-v natural sort of (version) numbers within text
-1 list one file per line
Для краткости два вышеуказанных флага можно объединить -v1
,
Чтобы отсортировать численно после первого символа, попробуйте это:
sort -k1.2n