Найти файл с наибольшим алфавитным символом в расширении файла
Как найти файл с наивысшим алфавитным символом в расширении файла? Пример файлов, которые создает мое приложение:
$ find . -name 'L_*.[J-Z]'
L_58420.K
L_58420.J
L_58420.M
L_46657.J
L_58420.N
L_58420.P
L_46657.N
L_58420.Q
L_46657.K
L_58420.O
L_46657.O
L_46657.L
L_46657.M
L_58420.L
и я хотел бы вернуться:
L_58420.Q
L_46657.O
Символ с более высоким алфавитом создается только в том случае, если файл с предыдущим символом уже существует, поэтому можно выполнять поиск / сортировку по дате.
3 ответа
Сортировка по второму полю и получение уникальных имен файлов:
find ... | sort -t"." -k2,1 -r |
awk -F. '$1!=lastname {lastname=$1; print $0; i++; if (i==2) exit}'
Когда все файлы имеют одинаковую длину файла, вы можете использовать
find ... | sort -t"." -k2,1 -r | uniq -w7
Простая сортировка:
find . -name 'L_*.[J-Z]' -printf "%f\n" | sort -t'.' -k2,2r
echo "L_58420.K
L_58420.J
L_58420.M
L_46657.J
L_58420.N
L_58420.P
L_46657.N
L_58420.Q
L_46657.K
L_58420.O
L_46657.O
L_46657.L
L_46657.M
L_58420.L" | sed 's/[_.]/ /g' | sort -r -k 2 -k 3 | while read L no c ; do if [[ "$no" != "$last" ]]; then echo L_$no.$c; last=$no; fi; done;
L_58420.Q
L_46657.O
Sed разбивает строку в _ и. на куски, так что сортировка может сортироваться по ключу 2 (число) и 3 (конечный символ). Цикл while читает константу L (игнорирует ее), a no и c. Печатает, если это новый $no, и сохраняет его как новый $last. В выводе мы вводим _ и. вернуться снова.
старое решение перед уточнением в комментарии:
Труба через Rev | сортировать -r | ред:
echo "L_58420.K
L_58420.J
L_58420.M
L_46657.J
L_58420.N
L_58420.P
L_46657.N
L_58420.Q
L_46657.K
L_58420.O
L_46657.O
L_46657.L
L_46657.M
L_58420.L" | rev | sort -r | rev
L_58420.Q
L_58420.P
L_46657.O
L_58420.O
L_46657.N
L_58420.N
L_46657.M
L_58420.M
L_46657.L
L_58420.L
L_46657.K
L_58420.K
L_46657.J
L_58420.J
rev
переворачивает линию, sort -r
сортирует назад (по убыванию) и снова rev
возвращает строки в правильном порядке.
Чтобы уменьшить вывод до двух строк, добавьте трубу | head -n 2
к концу. Вы можете добавить весь конвейер к вашей команде поиска, но мне не понравилось генерировать все эти имена файлов в тестовой среде.:)