#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