¿Cómo puedo buscar un archivo por su nombre y ruta parcial?


64

A menudo tengo un nombre de archivo y es una ruta parcial, por ejemplo, "content / docs / file.xml".

¿Hay una manera simple de buscar ese archivo, sin cortar manualmente en partes su nombre para proporcionar el nombre del directorio y el nombre del archivo por separado?

Sería genial si findfuncionara de esa manera, para poder correr find content/docs/file.xml, pero desafortunadamente no funciona.


1
Puede intentar agregar un comodín * al principio. find -path *content/docs/file.xmltrabajó para mi.
— Bob

gracias, @Bob, realmente funcionó para mí. Por cierto, interesante, que si estoy agregando una barra después de un asterisco: "find -path * / content / docs / file.xml", no funciona. Muchas gracias de todos modos.

también, @Bob, por favor, hazlo como respuesta y lo marcaré como correcto.

La razón por la que la barra oblicua después del asterisco no funcionó es probablemente porque el asterisco debería haberse escapado, vea la edición de mi respuesta.
— Bob

Respuestas:


72

Pase un *comodín para indicar una coincidencia para cualquier cosa . También necesita escapar del *s, por ejemplo:

find . -path \*content/docs/file.xml

o encierre el patrón entre comillas, por ejemplo:

find . -path "*content/docs/file.xml"

Como lo describe la página del manual:

$ encontrar. -name * .c -print

find: las rutas deben preceder a la expresión

Esto sucede porque el shell ha expandido * .c, lo que resulta en que find realmente reciba una línea de comando como esta:

encontrar . -nombre bigram.c código.c frcode.c localizar.c -impresión

Ese comando, por supuesto, no va a funcionar. En lugar de hacer las cosas de esta manera, debe encerrar el patrón entre comillas o escapar del comodín:

$ encontrar. -name \ *. c -print


10

find también tiene una opción de nombre completo find $top_dir -wholename *string*

find /usr -wholename *in/abiw*

>/usr/bin/abiword

No conozco la ruta completa, solo parcial, por lo que "-nombre completo" no funcionará.

la bandera es engañosa, mira mi ejemplo ... solo te permite extender la cadena a un directorio si lo sabes
— technosaurus

3
find . -type f | grep "content/docs/file.xml"

o solo

locate content/docs/file.xml

localizar es una opción interesante, pero busca en todo el disco, me gustaría tener la capacidad de especificar el directorio de búsqueda base o al menos especificar usando param, esa búsqueda debe hacerse desde este directorio (como lo hace su primera opción) , no desde la raíz.

1
@ user69817: por el contrario, localizar no busca en el disco, sino que interroga a una base de datos de localización, que generalmente se completa a través de cron una vez al día.
— Tink

1

Por ejemplo, buscar archivos en una ubicación usando asterisco / comodín ( *) como: dir=“/apps/*/instance01/" podría usar find ${dir} -name “*.jks”. poniendo todos los archivos en una matriz como esta:

arr=(`find ${dir} -name “*.jks"`)

si desea obtener archivos con otras extensiones, use 'o' de esta manera:

-name "*.keystore" -o -name "*.jks" -o -name “*.p12" porque -namesolo acepta una sola cadena, así que use 'o'.

Finalmente pon todo en una matriz como esta:

arr=(`find ${dir} -name "*.keystore" -o -name "*.jks" -o -name "*.p12"`)

Si tiene rutas completas, no rutas parciales, es mucho más fácil colocarlas en matrices como esta:

arr=(“/Users/ajay/Documents/keystore_and_p12files/"*.{keystore,p12,jks})
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.