Как мне найти все файлы с их расширением в верхнем регистре в каталоге.
Я пробовал :
$ find -name "*.[A-Z][A-Z][A-Z]"
Кажется, работает, но, конечно, это не проверяет файлы с более чем 3 буквами после последней точки.
Как мне найти все файлы с их расширением в верхнем регистре в каталоге.
Я пробовал :
$ find -name "*.[A-Z][A-Z][A-Z]"
Кажется, работает, но, конечно, это не проверяет файлы с более чем 3 буквами после последней точки.
Следующее работает для простых случаев:
find -name "*.*[A-Z]*" ! -name "*.*[^A-Z]*"
Это может произойти сбой для файлов с двумя или более точками в имени. Для этого случая вам нужно использовать регулярные выражения, например, с grep
:
find | grep '\.[A-Z][A-Z]*$'
или egrep
:
find | egrep '\.[A-Z]+$'
После комментария Камиля Мачоровского ответ можно сделать независимым от локали, используя [:upper:]
вместо A-Z
, например:
find | egrep '\.[[:upper:]]+$'
Боюсь, что мы, носители английского языка, легко можем забыть такие вопросы.
Вы можете использовать RE с опцией -regex
find -regextype posix-egrep -regex '.*\.[A-Z]{3}'
Есть некоторые моменты, использующие RE с find, я узнал об этом в книге pt_BR.
Опция -regex
хочет соответствовать всему пути, поэтому .*
соответствует всему до фактического RE, которое вы хотите найти.
Если RE может быть в середине, другой .*
Должен быть в конце.
Тип -regextype
указывает, какие метасимволы должны быть экранированы или нет.
Что я знаю, так это то, что в Unix/BSD find -E
разрешает все метасимволы без экранирования, а в GNU/Linux это -regextype posix-extended
, -regextype posix-awk
или -regextype posix-egrep
.