Найти файл с наибольшим алфавитным символом в расширении файла

Как найти файл с наивысшим алфавитным символом в расширении файла? Пример файлов, которые создает мое приложение:

$ 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 к концу. Вы можете добавить весь конвейер к вашей команде поиска, но мне не понравилось генерировать все эти имена файлов в тестовой среде.:)

Другие вопросы по тегам