Как я могу отсортировать имена файлов по номерам версий? - PullRequest
20 голосов
/ 28 октября 2010

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

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

Я бы хотел отсортировать файлы, чтобы получить такой результат:

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

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

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

но на выходе было

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

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

tree -v /data

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

Ответы [ 5 ]

25 голосов
/ 28 октября 2010

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

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

10 голосов
/ 28 октября 2010

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

Вам просто нужно сказать 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 голосов
/ 28 октября 2010

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

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 level: максимальная глубина отображения дерева каталогов

1 голос
/ 26 февраля 2018

Старый пост, но ... 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 iдумаю.

0 голосов
/ 28 октября 2010
$ 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...