Encuentra archivos por la longitud del nombre del archivo


10

Quiero encontrar todos los archivos por longitud de los nombres de archivo.

Por ejemplo, si quiero encontrar archivos de longitud 1, como por ejemplo a.go, b.go.

Puse:

grep '.\{1\}' file

Pero esto no funciona. ¿Qué comando puedo usar para buscar archivos por longitud de nombre de archivo?


a.goes un nombre de archivo de longitud 4. aes 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.
Peter Cordes

Respuestas:


3

grepbusca patrones en el contenido de los archivos. Si desea ver los nombres de los archivos, puede usar un globo de shell (si desea considerar solo los nombres de archivo en el directorio actual):

echo ?.go

(Por cierto, es el shell el que evalúa el glob, no el echocomando).

Si desea buscar en los directorios de forma recursiva, comenzando con el directorio actual, la herramienta a utilizar es find:

find . -name '?.go'

(Tenga en cuenta que debe citar el patrón para evitar que el shell lo evalúe como un globo antes de que findse invoque).


1
Esto también encontrará directorios que también coinciden con el patrón '? .Go'.
slm

@slm, los directorios son uno de los muchos tipos de archivos, el OP no especificó qué tipo de archivos buscaba.
Stéphane Chazelas

8

Si solo desea encontrar los nombres de archivo, puede usar el siguiente comando:

find -exec basename '{}' ';' | egrep '^.{100,}$'

Eso se ejecutará find, extrayendo el nombre del archivo o directorio usando basenamey luego buscando cualquier nombre de archivo o nombre de directorio que tenga al menos 100 caracteres. Si desea encontrar un nombre de archivo de una longitud exacta, use en {100}lugar de {100,}.

Si desea encontrar los nombres de archivo, incluida la ruta, haga lo siguiente:

find | egrep '/[^/]{100,}$'

Esto devolverá el nombre del archivo, incluida la ruta relativa a donde ejecutó el comando de búsqueda.


3

En primer lugar, grepbusca 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 sedcomando simplemente elimina el ./. La -Pbandera 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.


1

No especificas, pero si los archivos están dentro de una estructura de directorios, puedes usarlos findpara localizar archivos de longitud 1, con la ayuda de grep:

$ find . -type f  | grep -P '/.{1}\.'

Ejemplo

$ find . -type f  | grep -P '/.{1}\.' | head -10
./util-linux-2.19/include/c.h
./88366/a.bash
./89186/a.bash
./89563/b.txt
./89563/a.txt
./89563/c.txt
./89563/d.txt
./91734/2.c
./91734/4.c
./91734/1.c

En MacOS X, use egrep y elimine la opción -P
Bart Kummel

@BartKummel - en realidad en OSX Yo uso ggrep: heystephenwood.com/2013/09/install-gnu-grep-on-mac-osx.html . También greptenga en cuenta que este Q no fue etiquetado como OSX, por lo que el uso de es apto.
slm

1

Yo usaría algo como esto.

find . -type f -name "?.go"

Entonces, si pones dos "?" entonces está buscando nombres de archivo con dos caracteres y la extensión.


0

Cuando desee utilizar la expresión regular en el comando find, debe usar ""como:

find /var/log -iname "*.err" 

para su caso use:

find yourpath -type f -a -name "?.go"

Debe reemplazar la ruta real con YourPath, -amedios And -type fmedios que sólo busca los archivos normales.

? en su consulta significa un carácter, como DOS, si lo recuerda.


-1

ls ?.* debería darte los resultados deseados.


bienvenido a Unix.SE. Desafortunadamente, no es útil agregar respuestas a viejas preguntas que ya tienen muchas buenas respuestas. (A menos que haya una nueva forma mejor de resolver un viejo problema, o tenga una mejor solución que cualquiera de las respuestas anteriores). Si desea responder algunas preguntas, mire las nuevas preguntas en la página principal.
Peter Cordes
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.