Перш за все, здійснює 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, де ім'я та розширення були окремими та неявна.
завжди була частиною імені файлу.