Prima di tutto, grep
cerca tra i contenuti dei file, non cercherà i nomi dei file. Per quello che vuoi find
. Non ha un'opzione per impostare la lunghezza del nome file, ma puoi analizzarne l'output per ottenere ciò che desideri. Ecco alcuni esempi che eseguo in una directory contenente i seguenti file:
$ tree
.
├── a
├── ab
├── abc
├── abcd
└── dir
├── a
├── ab
├── abc
└── abcd
La ricerca di file in questa directory restituisce:
$ find . -type f | sort
./a
./ab
./abc
./abcd
./dir/a
./dir/ab
./dir/abc
./dir/abcd
Quindi, per trovare i file con una lunghezza di X, dovremo rimuovere il percorso e abbinare solo i caratteri dopo l'ultimo /
:
$ find . -type f | grep -P '/.{3}$'
Il sed
comando rimuove semplicemente il ./
. Il -P
flag attiva le espressioni regolari compatibili Perl che sono necessarie per le {n}
quali è una cosa PCRE e il $
mezzo "corrisponde all'estremità della stringa".
Potresti anche semplicemente fare questo:
find . -type f | grep -P '/...$'
Va bene per i piccoli numeri che digitano 15 punti per abbinare nomi di file di lunghezza 15 non è molto efficace.
Infine, se vuoi ignorare l'estensione e far corrispondere solo il nome del file, fai questo (come suggerito da @slm):
find . -type f | grep -P '/.{1}\.'
Tuttavia, questo troverà anche file come a.bo.go
. Questo è meglio se i nomi dei file possono contenere più di uno .
:
find . -type f | grep -P '/.{1}\.[^.]+$'
NOTA: la soluzione sopra presuppone che tu abbia nomi di file relativamente sani che non contengono nuovi caratteri di linea, ecc. Conterà inoltre di non ignorare gli spazi nei nomi di file quando calcoli la lunghezza che potrebbe non essere quella che desideri. Se uno di questi è un problema, fammi sapere e aggiornerò la mia risposta.
a.go
è un nome file di lunghezza 4.a
è un nome file di lunghezza 1. Questo è Unix, non DOS in cui il nome e l'estensione erano separati e un implicito.
faceva sempre parte del nome file.