¿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.

slhck
fuente
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

Mover
fuente
10

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

find /usr -wholename *in/abiw*

>/usr/bin/abiword
technosaurus
fuente
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
Nifle
fuente
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})
usuario450631
fuente