2012-07-04 17 views
103

He estado buscando un comando que devolverá los archivos del directorio actual que contienen una cadena en el nombre del archivo. He visto los comandos locate y find que pueden encontrar archivos que comienzan con algo first_word* o que terminan con algo *.jpg.Linux - Buscar archivos con el nombre que contiene cadena

¿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.markdown era un archivo en el directorio actual.

¿Cómo puedo devolver este archivo y otros que contengan la cadena touch? El uso de un comando como find '/touch/'

+0

la cuestión es confuso. ¿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 utilizar al hombre? No lo sé. –

+1

Gracias! La primera oración no especificaba si se trataba de contenido de archivos o un nombre de archivo. Actualizado. – Dru

Respuesta

157

Uso find:

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

encontrará todos los archivos en el directorio actual (eliminar maxdepth 1 si quieres que recursivo) que contienen "cadena" y se imprime en la pantalla.

Si se quiere evitar archivo que contiene ':', puede escribir:

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

Si desea utilizar grep (pero creo que no es necesario en la medida que no desea comprobar el contenido del archivo) que puede utilizar:

ls | grep touch

Pero, repito, find es una solución mejor y más limpio para su tarea.

+0

Gracias @ Zagorax. Esto lo hace exactamente. Desearía que el comando no fuera tan largo, pero ayee :) – Dru

+1

@Dru, modificado para cubrir el caso si quieres evitar dos puntos. 'find' es una herramienta muy poderosa, debe ser de alguna manera 'larga'. :) – Zagorax

+0

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

12

Uso grep de la siguiente manera:

grep -R "touch" . 

-R significa recursivo. Si prefieres no entrar en los subdirectorios, omítalo.

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

+0

Genial. Noté que algunos contenidos de archivos siguen un ':'. ¿Hay alguna forma de retener eso? Usando una opción tal vez? – Dru

+1

Pruebe: 'grep -R" touch ". | cut -d ":" -f 2' – carlspring

+0

Parece que solo produce el contenido de los archivos. Sin embargo, básicamente respondiste mi pregunta, puedo tratar de investigar un poco para retener los contenidos. – Dru

0

Si la cadena se encuentra al principio del nombre, puede hacer esto

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

'compgen' no es un martillo apropiado para este clavo.Esta herramienta poco utilizada está diseñada para enumerar * 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 de búsqueda contenido, por lo que es en su mayoría inútil. – msanford

2

La opción -maxdepth debe ser antes de la opción -name, como a continuación.,

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

Tienes que poner * antes y después de la "cadena". – Aaron

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

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

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

Sin embargo, no coincidirá con HELLO.C o HellO.C.Para que coincida con mayúsculas pase insensibles la opción -iname de la siguiente manera:

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

salidas de la muestra:

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

pasar la opción -type f sólo buscar archivos:

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

Los -iname obras, ya sea en GNU o BSD (incluido OS X) version find command. Si su versión de comando find no soporta -iname, pruebe la siguiente sintaxis utilizando grep comando:

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

o tratar de

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

salidas de la muestra:

/Users/user/Downloads/Z/HELLO.C 
/Users/user/Downloads/Z/HEllO.c 
/Users/user/Downloads/hello.c 
/Users/user/hello.c 
0
grep -R "somestring" | cut -d ":" -f 1 
+0

Esto parece ser una respuesta a una pregunta diferente, pero debido a que no proporcionó ninguna explicación, eso no es obvio para el autor de la pregunta ni para nadie más. –

Cuestiones relacionadas