En primer lugar, grep
busca a través del contenido de los archivos, no buscará los nombres de los archivos. Por eso que quieres find
. No tiene una opción para establecer la longitud del nombre de archivo, pero puede analizar su salida para obtener lo que desea. Aquí hay algunos ejemplos que ejecuto en un directorio que contiene los siguientes archivos:
$ tree
.
├── a
├── ab
├── abc
├── abcd
└── dir
├── a
├── ab
├── abc
└── abcd
La búsqueda de archivos en este directorio devuelve:
$ find . -type f | sort
./a
./ab
./abc
./abcd
./dir/a
./dir/ab
./dir/abc
./dir/abcd
Entonces, para encontrar los archivos con una longitud de X, necesitaremos eliminar la ruta y hacer coincidir solo los caracteres después del último /
:
$ find . -type f | grep -P '/.{3}$'
El sed
comando simplemente elimina el ./
. La -P
bandera activa Expresiones regulares compatibles con Perl que son necesarias para lo {n}
que es una cosa PCRE y los $
medios "coinciden con el final de la cadena".
También podría simplemente hacer esto:
find . -type f | grep -P '/...$'
Eso está bien para números pequeños que escriben 15 puntos para que coincidan con nombres de archivo de longitud 15 no es muy eficiente.
Finalmente, si desea ignorar la extensión y hacer coincidir solo el nombre del archivo, haga esto (como sugirió @slm):
find . -type f | grep -P '/.{1}\.'
Sin embargo, esto también encontrará archivos como a.bo.go
. Esto es mejor si sus nombres de archivo pueden contener más de uno .
:
find . -type f | grep -P '/.{1}\.[^.]+$'
NOTA: La solución anterior supone que tiene nombres de archivo relativamente sanos que no contienen nuevos caracteres de línea, etc. También contará no ignorar los espacios en los nombres de archivo al calcular la longitud que podría no ser la que desea. Si alguno de estos es un problema, avíseme y actualizaré mi respuesta.
a.go
es un nombre de archivo de longitud 4.a
es un nombre de archivo de longitud 1. Esto es Unix, no DOS, donde el nombre y la extensión estaban separados y.
siempre había una parte implícita del nombre de archivo.