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

man grep, la segunda conman find. ¿por qué googlearías en lugar de usar man? No lo sé.Respuestas:
Uso
find:find . -maxdepth 1 -name "*string*" -printEncontrará 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 "*:*" -printSi desea usar
grep(pero creo que no es necesario siempre que no desee verificar el contenido del archivo) puede usar:ls | grep touchPero, repito,
findes una solución mejor y más limpia para su tarea.fuente
findes una herramienta muy poderosa, debe ser de alguna manera 'larga'. :)-printya que este es el comportamiento predeterminado y.esta es la carpeta predeterminada donde se verifica.find . -name "*string*"Funciona muy bien también. La eliminación.arroja un error de mi parte. Gracias de nuevo @Zagorax.Use grep de la siguiente manera:
-Rsignifica recursa. Si prefiere no entrar en los subdirectorios, omítalo.-isignifica "ignorar caso". Es posible que también valga la pena intentarlo.fuente
:. ¿Hay alguna forma de retener eso? ¿Usando una opción quizás?grep -R "touch" . | cut -d ":" -f 2grep -R "touch" . | cut -d ":" -f 1(lo siento, debe haberte leído mal).grepo devuelve archivos con contenido y nombres de archivo que contienentoucho contenido que contienetouch, todavía no estoy seguro de cuál es el caso. De la lista de archivos devueltos, la mitad contienetouchen el título y la otra mitad contienetouchen el cuerpo, no el título. Acabo de darme cuenta de esto.La
-maxdepthopción debe estar antes de la-nameopción, como a continuación.fuente
Esto buscará en todo el sistema
$HOME(es decir/home/username/) cualquier archivo llamado "hello.c" y mostrará sus nombres de ruta:Sin embargo, no coincidirá
HELLO.CoHellO.C. Para hacer coincidir las mayúsculas y minúsculas, pase la-inameopción de la siguiente manera:Resultados de muestra:
Pase la
-type fopción de buscar solo archivos: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 elgrepcomando:O tratar
Resultados de muestra:
fuente
Si la cadena está al principio del nombre, puede hacer esto
fuente
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.Una alternativa a las muchas soluciones ya proporcionadas es hacer uso del glob
**. Cuando usabashla opciónglobstar(shopt -s globstar) o hace uso dezsh, puede usar el glob**para esto.realiza una búsqueda recursiva en el directorio para los archivos nombrados
bar(potencialmente incluyendo el archivobaren 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
zshybashaquí. Si bienbashatravesará enlaces blandos a directorios,zshno lo hará. Para esto tienes que usar el glob***/inzsh.fuente
fuente
fuente