Подтвердить что ты не робот

Как я могу сортировать имена файлов по номерам версий?

В каталоге "data" находятся следующие файлы:

командной 1.9а-установка
Команда-2.0a-установка
Команда-2.0c-установка
command-2.0-setup

Я хотел бы отсортировать файлы для получения этого результата:

командной 1.9а-установка
Команда-2,0-установка
Команда-2.0a-установка
command-2.0c-setup

Я пробовал это

find /data/ -name 'command-*-setup' | sort --version-sort --field-separator=- -k2 

но выход был

командной 1.9а-установка
Команда-2.0a-установка
Команда-2.0c-установка
command-2.0-setup

Единственный способ, который я нашел, который дал мне мой желаемый результат, был

tree -v /data

Как я могу получить с сортировкой вывод в желаемом порядке?

4b9b3361

Ответ 1

Изменить: Оказалось, что Benoit был на правильном пути, и Роланд опрокинул баланс

Вам просто нужно сказать sort рассмотреть только поле 2 (добавить ", 2" ):

find ... | sort --version-sort --field-separator=- --key=2,2

Исходный ответ: игнорировать

Если ни один из ваших имен файлов не содержит пробелов между дефисами, вы можете попробовать следующее:

find ... | sed 's/.*-\([^-]*\)-.*/\1 \0/;s/[^0-9] /.&/' | sort --version-sort --field-separator=- --key=2 | sed 's/[^ ]* //'

Первая команда sed делает строки похожими на это (я добавил "10", чтобы показать, что сортировка является числовой):

1.9.a command-1.9a-setup
2.0.c command-2.0c-setup
2.0.a command-2.0a-setup
2.0 command-2.0-setup
10 command-10-setup

Дополнительная точка делает сортировку буквенного суффицированного номера версии после номера версии без суффикса. Вторая команда sed удаляет префиксный номер версии из каждой строки.

Существует много способов, с помощью которых может произойти сбой.

Ответ 2

Если вы зададите для сортировки, что хотите только рассмотреть второе поле (-k2), не жалуйтесь, что он не учитывает третий.

В вашем случае запустите sort --version-sort без каких-либо других аргументов, возможно, это будет лучше.

Ответ 3

Похоже, что это работает:

find /data/ -name 'command-*-setup' | sort -t - -V -k 2,2

не сортируется, но работает:

tree -ivL 1 /data/ | perl -nlE 'say if /\Acommand-[0-9][0-9a-z.]*-setup\z/'

-v: сортировать результат по версии
-i: заставляет дерево не печатать строки отступов
-L уровень: максимальная глубина отображения дерева каталогов

Ответ 4

$ cat files
command-1.9a-setup
command-2.0c-setup
command-10.1-setup
command-2.0a-setup
command-2.0-setup

$ cat files | sort -t- -k2,2 -n
command-1.9a-setup
command-2.0-setup
command-2.0a-setup
command-2.0c-setup
command-10.1-setup

$ tac files | sort -t- -k2,2 -n
command-1.9a-setup
command-2.0-setup
command-2.0a-setup
command-2.0c-setup
command-10.1-setup

Ответ 5

Старый пост, но... ls -l --sort=version может помочь (хотя для OP, например, сортировка такая же, как в ls -l в RHEL 7.2):

command-1.9a-setup
command-2.0a-setup
command-2.0c-setup
command-2.0-setup

YMMV я думаю.