Как я могу сортировать имена файлов по номерам версий?
В каталоге "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
Как я могу получить с сортировкой вывод в желаемом порядке?
Ответы
Ответ 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 я думаю.