2

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

Я пробовал :

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

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

2 ответа2

5

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

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:]]+$'

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

2

Вы можете использовать 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 .

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .