Po pierwsze, grep
przeszukuje 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}$'
sed
Komenda tylko usuwa ./
. -P
Flaga 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.go
to nazwa pliku o długości 4.a
to 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.