Использование регулярных выражений или чего-то еще для поиска расширения файла

#regex #bash #cygwin

#регулярное выражение #bash #cygwin

Вопрос:

Мне нужно создать скрипт bash, который будет искать в заданном каталоге определенные расширения файлов. Расширения файлов имеют форму .210 .110 .311 .211 и так далее. Я не могу сделать просто «.2 потому что есть имена файлов, которые имеют это в имени. Есть ли способ установить буфер после «.2«, чтобы длина расширения составляла всего 3 символа? Это удалит все неправильные результаты поиска.

Прямо сейчас я использую find /cygdrive/x/Clients -name '*.210'

Спасибо!

Ответ №1:

Вы должны иметь возможность использовать подстановочные знаки. Для всех файлов с 3-значным числовым расширением должно быть достаточно следующего.

 ls *.[0-9][0-9][0-9] 
  

Если вам нужны только расширения, начинающиеся с числа 2 , попробуйте это:

 ls *.2[0-9][0-9]
  

Комментарии:

1. и в команде find, find . -name '*.2[0-9][0-9]' . Если следующие два символа не обязательно являются цифрами, используйте '*.2??'

Ответ №2:

Если я правильно прочитал ваш вопрос, вам просто нужно выполнить следующее в целевом каталоге:

 printf '%sn' *.[0-9][0-9][0-9]
  

Выходные данные не будут включать точечные файлы. Если они вам нужны, вы можете включить опцию dotglob * bash *. Было бы безопаснее также включить опцию nullglob (см. Комментарии @c00kiemon5ter ниже).

Комментарии:

1. если ничего не совпадает, тогда printf шаблон будет напечатан в виде строки, и это может быть небезопасно или нежелательно. просто нужно остерегаться..

2. @c00kiemon5ter, хорошая мысль! Спасибо! Поэтому параметр nullglob также должен быть включен.

Ответ №3:

вы можете использовать регулярные выражения, если вы подключаетесь к grep

 find /cygdrive/x/Clients | grep ".2dd$"
  

но это намного медленнее, чем использование подстановочных знаков, как упоминал Kurt S