#linux #файлы #bash #сортировка
Есть в папке некоторое колличество файлов:
pre_1_filea
pre_2_fileb
...
pre_9_filek
pre_10_filel
...
Их надо вывести отсортировав по числовой составляющей имени файла. Префикс имени
файлов pre всегда один и тот же для всего набора файлов и может содержать любые допустимые
символы. Разделитель _ может поменяться на - или еще какой другой.
Если пробую так:
$ ls -1 pre*
pre_1_filea
pre_10_filel
pre_2_fileb
pre_9_filek
, то файлы отсортированы в алфавитном порядке.
Как отсортировать их по числовой составляющей в имени?
Пробовал так же с sort -n -t_ -k2, работает, но разделитель не гарантируется и может
также встретиться в префиксе имени pre.
Ответы
Ответ 1
Должна подойти сортировка по версии: $ for i in {1,2,9,10}; do touch A2-V411-THZ_${i}_file; done $ ls -1v A2-V411-THZ* A2-V411-THZ_1_file A2-V411-THZ_2_file A2-V411-THZ_9_file A2-V411-THZ_10_file Из мнауала man ls: -v natural sort of (version) numbers within text Здесь подробнее about-version-sort. Можно предварительно проверить, удовлетворяет ли эта сортировка структуре имени файлов: Version-sorted strings are compared such that if ver1 and ver2 are version numbers and prefix and suffix (suffix matching the regular expression ‘(\.[A-Za-z~][A-Za-z0-9~]*)*’) are strings then ver1 < ver2 implies that the name composed of “prefix ver1 suffix” sorts before “prefix ver2 suffix”.Ответ 2
Очень непрямой подход, но работает. Можно вытащить первое число из имени файла, поставить его перед именем, разделив пробелом, сортировать по числам, и убрать число: sed -n -e 's/[^0-9]*\([0-9]\+\).*/\1 \0/; p' | sort -n | awk '{ print $2 }' Для следующего набора тестовых кейсов работает: pre_1_file pre_9_file 2_file pre8_file pre_foo_bar_3_file pre_10_file Если в префиксе у вас есть числа, решение немного меняется: prefix="A2-V411-THZ" sed -n -e "s/${prefix}[^0-9]*\([0-9]\+\).*/\1 \0/; p" | sort -n | awk '{ print $2 }' Прошу обратить внимание на двойные кавычки в данном случае. Работает верно на таком наборе: A2-V411-THZ_1_file A2-V411-THZ_9_file A2-V411-THZ-2_file A2-V411-THZ8_file A2-V411-THZ_foo_bar_3_file A2-V411-THZ_10_file
Комментариев нет:
Отправить комментарий