He estado buscando un comando que devolverá archivos del directorio actual que contiene una cadena en el nombre del archivo. He visto locate
y find
comandos 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.markdown
era 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*" -print
Encontrará todos los archivos en el directorio actual (elimínelos
maxdepth 1
si 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,
find
es una solución mejor y más limpia para su tarea.fuente
find
es una herramienta muy poderosa, debe ser de alguna manera 'larga'. :)-print
ya 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:
-R
significa recursa. Si prefiere no entrar en los subdirectorios, omítalo.-i
significa "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 2
grep -R "touch" . | cut -d ":" -f 1
(lo siento, debe haberte leído mal).grep
o devuelve archivos con contenido y nombres de archivo que contienentouch
o contenido que contienetouch
, todavía no estoy seguro de cuál es el caso. De la lista de archivos devueltos, la mitad contienetouch
en el título y la otra mitad contienetouch
en el cuerpo, no el título. Acabo de darme cuenta de esto.La
-maxdepth
opción debe estar antes de la-name
opció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.C
oHellO.C
. Para hacer coincidir las mayúsculas y minúsculas, pase la-iname
opción de la siguiente manera:Resultados de muestra:
Pase la
-type f
opción de buscar solo archivos:El
-iname
funciona 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 elgrep
comando:O tratar
Resultados de muestra:
fuente
Si la cadena está al principio del nombre, puede hacer esto
fuente
compgen
No 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 usabash
la 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 archivobar
en 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
zsh
ybash
aquí. Si bienbash
atravesará enlaces blandos a directorios,zsh
no lo hará. Para esto tienes que usar el glob***/
inzsh
.fuente
fuente
fuente