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

405
40detectives

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

Я пробовал :

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

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

2

2 ответа на вопрос

5
AFH

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

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

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

Избегайте `[AZ]`. [Как сделать `grep '[AZ]'` независимым от локали?] (Https://stackoverflow.com/a/6800018) Kamil Maciorowski 6 лет назад 1
@KamilMaciorowski - Правильный аргумент, но именно тот, кто задавал вопросы, первоначально предположил, что «[AZ]» - это то, что он хотел. AFH 6 лет назад 0
2
Paulo

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

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

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

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

-regextypeСообщает, какая мета-символы должны быть экранированы или нет.

Что я знаю, так это то, что в Unix / BSD find -Eразрешены все метасимволы без экранирования, а в GNU / Linux то же самое -regextype posix-extended, -regextype posix-awkили -regextype posix-egrep.

Дополнительная информация о руководстве https://www.gnu.org/software/findutils/manual/html_mono/find.html#Regular-Expressions Paulo 6 лет назад 0