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/'

Dru
fuente
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.

Zagorax
fuente
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.

Carlspring
fuente
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
Sunil Dias
fuente
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
shilovk
fuente
0

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

$ compgen -f .bash
.bashrc
.bash_profile
.bash_prompt
Steven Penny
fuente
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.

kvantour
fuente
0
find / -exec grep -lR "{test-string}" {} \;
Shahid
fuente
1
Esta respuesta fue marcada por baja calidad. Explique qué hacen los cambios propuestos.
Miroslav Glamuzina
-2
grep -R "somestring" | cut -d ":" -f 1
Saurabh kukade
fuente
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