Busque un file específico y cambie a su directory

¿Cuál es la mejor manera de ir a un directory que contiene un file específico? (Suponiendo que estamos comenzando en la raíz de donde deseamos search). Estoy usando Cygwin.

SOLUCIÓN: Mi solución final fue poner esto en mi file .bashrc.

jump2_func() { cd "$(find . -name $1 -printf %h -quit 2>/dev/null)" } alias jump2=jump2_func 

 cd "$(find . -name filename -printf %h -quit 2>/dev/null)" 

Si no se encuentra ningún file con este nombre, cd cambia al directory de inicio. Si eso no se quiere, entonces necesitas algo como esto:

 dir="$(find . -name filename -printf %h -quit 2>/dev/null)" test -d "$dir" && cd "$dir" 

Dos partes: Encontrar un file y cambiar al directory de un file encontrado.

Encontrar un file

Si tiene el nombre de un file que le gustaría ubicar en algún lugar de la jerarquía de files en su sistema, hay dos maneras en que puede pensar inmediatamente:

  1. Use find .
  2. Use locate

Para ubicar un file usando find :

 $ find / -type f -name "filename" -print 

Esto recorrerá todo el sistema de files desde la raíz ( / ) hacia abajo e imprimirá las routes completas de todos los files regulares llamados filename . Cambie / a la ruta de directory desde la que quiera search.

Para encontrar un file usando locate :

 $ locate -r -b '^filename$' 

Esto generará todas las routes de todos los files (y directorys, etc.) cuyo nombre es nombre de filename . Esto es usualmente mucho más rápido que usar find . Estoy usando -r y una expresión regular aquí para que coincida con los nombres completos de los files, de lo contrario puede get coincidencias como file3 para una búsqueda de file . La opción -b hace que locate solo coincida con el "nombre base" de las routes, es decir, el nombre de file real al final de cada ruta.

Para poder utilizar locate en Cygwin, primero debe inicializar la " locate database". Usted hace esto corriendo

 $ updatedb 

La desventaja de locate es que solo conoce las ubicaciones de los files presentes cuando se ejecutó updatedb . Esta es la razón por la que la mayoría de los sistemas Unix con locate generalmente ejecutan updatedb (o el command equivalente) usando cron (que no creo que esté disponible en Cygwin) a intervalos regulares; una vez al día en algunos Linuxes, o una vez a la semana, como es el valor pnetworkingeterminado en OpenBSD.

Cambiar al directory de un file encontrado

Como ninguno de estos methods garantiza devolver solo una ruta de file, es difícil encontrar una manera segura de cambiar el directory de trabajo al directory del file encontrado (si hay muchos, ¿cuál elegir?).

Suponiendo que desea elegir el primer resultado:

 cd "$( dirname "$(somecommand | head -n 1)" )" 

Aquí, somecommand es find o locate como arriba.

head -n 1 seleccionará el primer resultado de la list, y dirname extraerá solo la ruta del directory que contiene el file. cd luego cambiará el directory de trabajo a ese directory.

Tenga en count que si utiliza locate , las coincidencias también pueden contener nombres de cosas que no son files regulares (por ejemplo, directorys).