Encuentra todos los archivos con el nombre que contiene la cadena


177

He estado buscando un comando que devolverá archivos del directorio actual que contiene una cadena en el nombre del archivo. He visto locatey findcomandos que pueden encontrar archivos que comienzan con algo first_word*o que terminan con algo *.jpg.

¿Cómo puedo devolver una lista de archivos que contienen una cadena en el nombre del archivo?

Por ejemplo, si 2012-06-04-touch-multiple-files-in-linux.markdownera un archivo en el directorio actual.

¿Cómo podría devolver este archivo y otros que contengan la cadena touch? Usar un comando comofind '/touch/'


La pregunta es confusa. ¿Desea encontrar archivos que contengan una cadena o archivos cuyos nombres contengan dicha cadena? la primera pregunta se responde con man grep, la segunda con man find. ¿por qué googlearías en lugar de usar man? No lo sé.
solo alguien

1
¡Gracias! La primera oración no especificó si se trataba del contenido del archivo o de un nombre de archivo. Actualizado.
Dru

Respuestas:


303

Uso find:

find . -maxdepth 1 -name "*string*" -print

Encontrará todos los archivos en el directorio actual (elimínelos maxdepth 1si lo desea de forma recursiva) que contengan "cadena" y lo imprimirá en la pantalla.

Si desea evitar el archivo que contiene ':', puede escribir:

find . -maxdepth 1 -name "*string*" ! -name "*:*" -print

Si desea usar grep(pero creo que no es necesario siempre que no desee verificar el contenido del archivo) puede usar:

ls | grep touch

Pero, repito, findes una solución mejor y más limpia para su tarea.


Gracias @Zagorax. Esto lo hace exactamente. Ojalá el comando no fuera tan largo pero sí :)
Dru

2
@Dru, modificado para cubrir el caso si desea evitar dos puntos. findes una herramienta muy poderosa, debe ser de alguna manera 'larga'. :)
Zagorax

Gracias, el primero lo hizo perfectamente sin devolver ningún contenido.
Dru

3
@Dru, si desea que sea 'más corto', puede evitarlo, -printya que este es el comportamiento predeterminado y .esta es la carpeta predeterminada donde se verifica.
Zagorax

1
find . -name "*string*"Funciona muy bien también. La eliminación .arroja un error de mi parte. Gracias de nuevo @Zagorax.
Dru

14

Use grep de la siguiente manera:

grep -R "touch" .

-Rsignifica recursa. Si prefiere no entrar en los subdirectorios, omítalo.

-isignifica "ignorar caso". Es posible que también valga la pena intentarlo.


Excelente. Noté que algunos contenidos del archivo siguen a :. ¿Hay alguna forma de retener eso? ¿Usando una opción quizás?
Dru

1
Prueba:grep -R "touch" . | cut -d ":" -f 2
carlspring

Parece que solo produce el contenido de los archivos. Sin embargo, esencialmente respondiste a mi pregunta, puedo intentar investigar un poco para retener el contenido.
Dru

Ah ... solo necesitas los nombres de los archivos? Ejecutar: grep -R "touch" . | cut -d ":" -f 1 (lo siento, debe haberte leído mal).
carlspring el

Gracias @carlspring esto es interesante. grepo devuelve archivos con contenido y nombres de archivo que contienen toucho contenido que contiene touch, todavía no estoy seguro de cuál es el caso. De la lista de archivos devueltos, la mitad contiene touchen el título y la otra mitad contiene touchen el cuerpo, no el título. Acabo de darme cuenta de esto.
Dru

5

La -maxdepthopción debe estar antes de la -nameopción, como a continuación.

find . -maxdepth 1 -name "string" -print

1
Tienes que poner * antes y después de la "cadena".
Aerin

3
find $HOME -name "hello.c" -print

Esto buscará en todo el sistema $HOME(es decir /home/username/) cualquier archivo llamado "hello.c" y mostrará sus nombres de ruta:

/Users/user/Downloads/hello.c
/Users/user/hello.c

Sin embargo, no coincidirá HELLO.Co HellO.C. Para hacer coincidir las mayúsculas y minúsculas, pase la -inameopción de la siguiente manera:

find $HOME -iname "hello.c" -print

Resultados de muestra:

/Users/user/Downloads/hello.c
/Users/user/Downloads/Y/Hello.C
/Users/user/Downloads/Z/HELLO.c
/Users/user/hello.c

Pase la -type fopción de buscar solo archivos:

find /dir/to/search -type f -iname "fooBar.conf.sample" -print
find $HOME -type f -iname "fooBar.conf.sample" -print

El -inamefunciona bien en GNU o BSD (incluyendo OS X) de comandos versión hallazgo. Si su versión del comando find no es compatible -iname, pruebe la siguiente sintaxis con el grepcomando:

find $HOME | grep -i "hello.c"
find $HOME -name "*" -print | grep -i "hello.c"

O tratar

find $HOME -name '[hH][eE][lL][lL][oO].[cC]' -print

Resultados de muestra:

/Users/user/Downloads/Z/HELLO.C
/Users/user/Downloads/Z/HEllO.c
/Users/user/Downloads/hello.c
/Users/user/hello.c

0

Si la cadena está al principio del nombre, puede hacer esto

$ compgen -f .bash
.bashrc
.bash_profile
.bash_prompt

3
compgenNo es un martillo apropiado para esta uña. Esta herramienta poco utilizada está diseñada para enumerar los comandos disponibles y, como tal, enumera los archivos en el directorio actual (que podrían ser scripts) y no puede recurrir ni mirar más allá del comienzo de un nombre de archivo ni buscar contenido de archivos, por lo que En su mayoría inútil.
msanford

0

Una alternativa a las muchas soluciones ya proporcionadas es hacer uso del glob **. Cuando usa bashla opción globstar( shopt -s globstar) o hace uso de zsh, puede usar el glob **para esto.

**/bar

realiza una búsqueda recursiva en el directorio para los archivos nombrados bar(potencialmente incluyendo el archivo baren el directorio actual). Observe que esto no se puede combinar con otras formas de globbing dentro del mismo segmento de ruta; en ese caso, los *operadores vuelven a su efecto habitual.

Tenga en cuenta que hay una sutil diferencia entre zshy bashaquí. Si bien bashatravesará enlaces blandos a directorios, zshno lo hará. Para esto tienes que usar el glob ***/in zsh.


0
find / -exec grep -lR "{test-string}" {} \;

1
Esta respuesta fue marcada por baja calidad. Explique qué hacen los cambios propuestos.
Miroslav Glamuzina

-2
grep -R "somestring" | cut -d ":" -f 1

2
Esto parece ser una respuesta a una pregunta diferente, pero debido a que no ha proporcionado ninguna explicación, eso no es obvio para el autor de la pregunta ni para nadie más.
Toby Speight
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.