Перш за все, здійснює grepпошук по вмісту файлів, він не буде шукати імена файлів. Для цього ти хочеш find. У нього немає можливості встановити довжину імені файлу, але ви можете проаналізувати його вихід, щоб отримати те, що ви хочете. Ось кілька прикладів, які я запускаю в каталозі, що містить такі файли:
$ tree
.
├── a
├── ab
├── abc
├── abcd
└── dir
├── a
├── ab
├── abc
└── abcd
Пошук файлів у цьому каталозі повертає:
$ find . -type f | sort
./a
./ab
./abc
./abcd
./dir/a
./dir/ab
./dir/abc
./dir/abcd
Отже, щоб знайти файли довжиною X, нам потрібно буде видалити шлях і відповідати лише символам після останнього /:
$ find . -type f | grep -P '/.{3}$'
sedКоманда просто видаляє ./. -PПрапор активує Perl Compatible Regular Expressions , які необхідні для {n}яких є PCRE речі і $означає «відповідати кінця рядка».
Ви також можете просто зробити це:
find . -type f | grep -P '/...$'
Це добре для невеликих цифр, набравши 15 крапок, щоб відповідати іменам довжини 15, не дуже ефективно.
Нарешті, якщо ви хочете ігнорувати розширення та відповідати лише імені файлу, зробіть це (як @slm запропонував):
find . -type f | grep -P '/.{1}\.'
Однак це також знайде файли на зразок a.bo.go. Це краще, якщо ваші імена файлів можуть містити більше .:
find . -type f | grep -P '/.{1}\.[^.]+$'
ПРИМІТКА. У наведеному вище рішенні передбачається, що у вас є відносно розумні назви файлів, які не містять нових символів рядків і т.д. Якщо будь-яка з цих проблем є проблемою, дайте мені знати, і я оновлю свою відповідь.
a.go- це ім'я файлу довжиною 4.a- це ім'я файлу довжиною 1. Це Unix, а не DOS, де ім'я та розширення були окремими та неявна.завжди була частиною імені файлу.