Po pierwsze, grepprzeszukuje zawartość plików, nie szuka nazw plików. Do tego chcesz find. Nie ma opcji ustawiania długości nazwy pliku, ale możesz przeanalizować jego wynik, aby uzyskać to, czego chcesz. Oto kilka przykładów, które uruchamiam w katalogu zawierającym następujące pliki:
$ tree
.
├── a
├── ab
├── abc
├── abcd
└── dir
├── a
├── ab
├── abc
└── abcd
Wyszukiwanie plików w tym katalogu zwraca:
$ find . -type f | sort
./a
./ab
./abc
./abcd
./dir/a
./dir/ab
./dir/abc
./dir/abcd
Aby znaleźć pliki o długości X, musimy usunąć ścieżkę i dopasować tylko znaki po ostatnim /:
$ find . -type f | grep -P '/.{3}$'
sedKomenda tylko usuwa ./. -PFlaga uaktywnia Perl Compatible Regular Expressions, które są potrzebne na {n}co jest rzeczą PCRE i $oznacza „dopasować koniec napisu”.
Możesz również po prostu to zrobić:
find . -type f | grep -P '/...$'
To dobrze, jeśli małe liczby wpisujące 15 kropek w celu dopasowania nazw plików o długości 15 nie są zbyt wydajne.
Na koniec, jeśli chcesz zignorować rozszerzenie i dopasować tylko nazwę pliku, zrób to (zgodnie z sugestią @slm):
find . -type f | grep -P '/.{1}\.'
Jednak znajdzie to również pliki takie jak a.bo.go. Jest to lepsze, jeśli twoje nazwy plików mogą zawierać więcej niż jeden .:
find . -type f | grep -P '/.{1}\.[^.]+$'
UWAGA: Powyższe rozwiązanie zakłada, że masz względnie rozsądne nazwy plików, które nie zawierają nowych znaków wiersza itp. Będzie również liczyć nie ignorować spacji w nazwach plików podczas obliczania długości, która może być inna niż chcesz. Jeśli któryś z tych problemów stanowi problem, daj mi znać, a zaktualizuję odpowiedź.
a.goto nazwa pliku o długości 4.ato nazwa pliku o długości 1. To jest Uniks, a nie DOS, gdzie nazwa i rozszerzenie były osobne, a domniemana.zawsze była częścią nazwy pliku.