Найти имена файлов с расширением в верхнем регистре

Как найти все файлы с расширением в верхнем регистре рекурсивно в каталоге.

Я пробовал :

$ find -name "*.[A-Z][A-Z][A-Z]"

вроде работает, но конечно это не проверяет файлы с более чем 3 буквы после последней точки.

5
задан 40detectives
источник

2 ответов

следующие работы для простых случаев:

find -name "*.*[A-Z]*" ! -name "*.*[^A-Z]*"

это может произойти сбой для файлов с двумя или более точками в имени. Для этого нужно использовать регулярные выражения, например, с grep:

find | grep '\.[A-Z][A-Z]*$'

или egrep:

find | egrep '\.[A-Z]+$'

следующий комментарий Камиль Maciorowski, ответ мог быть сделан независимым от локали с помощью [:upper:] на месте A-Z, например:

find | egrep '\.[[:upper:]]+$'

Я боюсь, что мы, носители английского языка, можем легко забыть такое вопросы.

5
отвечен AFH 2018-10-06 23:35:28
источник

вы можете использовать опцию RE with-regex

find -regextype posix-egrep -regex '.*\.[A-Z]{3}'

есть некоторые моменты, используя RE с find, я узнал, что в книге pt_BR.

-regex параметр хочет соответствовать всему пути, поэтому .* матчи все перед фактическим RE вы хотите соответствовать. Если RE может быть в середине, другой .* должно быть место в конце.

на -regextype говорит что мета-символы должны быть экранированы или нет.

Я знаю, что в Unix/БСД find -E разрешает все мета-символы unescaped, а в GNU/Linux то же самое -regextype posix-extended, -regextype posix-awk или -regextype posix-egrep.

2
отвечен Paulo 2018-10-06 19:08:08
источник

Другие вопросы bash bash-scripting sh