2012-02-21 4 views
7

Usando bash, ¿cómo puedo encontrar un archivo con un nombre específico en algún lugar del árbol de directorios desde el pwd?Buscar archivo por nombre en el árbol del directorio, usando bash

Para ser más claro. Quiero encontrar un archivo que se encuentre en la raíz de mi directorio de trabajo, pero no sé dónde está la raíz, y mi pwd podría estar en cualquier lugar debajo de la raíz.

+0

¿Qué quieres decir con que no sabes dónde está tu raíz? ¿Puedes dar un pequeño ejemplo de cómo se ve tu árbol de directorios? ¿Cuál es su directorio de trabajo actual y dónde quiere buscar los archivos? Generalmente, para buscar en todas partes, puede ejecutar 'find/-name ' como usuario 'root'. –

Respuesta

11

Encuentra file.txt hasta la raíz

$ x=`pwd`; while [ "$x" != "/" ] ; do x=`dirname "$x"`; find "$x" -maxdepth 1 -name file.txt; done 
+1

Grandes cosas @kev. Acabo de agregar un salto al ciclo: '' x = 'pwd'; while ["$ x"! = "/"]; hacer x = 'dirname" $ ​​x "'; echo "$ x"; if ['find" $ x "-maxdepth 1 -name erm.properties']; luego romper; fi; done'' –

+0

Esto no parece funcionar para mí. Simplemente sigue haciendo el tiempo una y otra vez para siempre. La x va de la ruta actual a "/" pero después de eso, comienza todo de nuevo. – trans

+0

No importa. Mi problema surgió al hacer un alias y luego llamar al alias dentro del alias. – trans

2

He definido la siguiente función en mi ~/.bashrc:

dnif() { 
    # Recursively list a file from PWD up the directory tree to root 
    [[ -n $1 ]] || { echo "dnif [ls-opts] name"; return 1; } 
    local THERE=$PWD RC=2 
    while [[ $THERE !=/]] 
     do [[ -e $THERE/${2:-$1} ]] && { ls ${2:+$1} $THERE/${2:-$1}; RC=0; } 
      THERE=$(dirname $THERE) 
     done 
    [[ -e $THERE/${2:-$1} ]] && { ls ${2:+$1} /${2:-$1}; RC=0; } 
    return $RC 
} 

que buscar un nombre que proporcione como parámetro en cada directorio hacia arriba desde la corriente hasta la raíz, y si se encuentra, enlistala con 'ls' y las opciones ls opcionales que proporciones. Ejemplo de salida:

[email protected]:~/dev/example 
$ dnif; echo $? 
dnif [ls-opts] name 
1 
[email protected]:~/dev/example 
$ dnif -alp nonesuch; echo $? 
2 
[email protected]:~/dev/example 
$ dnif -alp .bashrc; echo $? 
-rw-r--r-- 1 me mine 3486 Apr 3 2012 /home/me/.bashrc 
0 
[email protected]:~/dev/example 
$ dnif -d . 
/home/me/dev/example/. 
/home/me/dev/. 
/home/me/. 
/home/. 
/. 

Tenga en cuenta:

  • "dnif" es "encontrar" al revés.
  • La función es un bucle finito (no recursivo), no crea subcapas y utiliza Bash incorporados tanto como sea posible para la velocidad.
  • Se muestran todas las visitas en cada nivel de directorio ascendente.
  • Los ls -opts son opcionales, pero deben preceder al argumento de búsqueda requerido.
  • El argumento de búsqueda puede ser un archivo o directorio.
  • Si el argumento de búsqueda es un directorio, incluya ls -opt '-d' para restringir los resultados a nombres de directorio en lugar de a contenido.
  • La función devuelve el código de salida
    • 0 si hay al menos un hit,
    • 1 si no se proporcionan los parámetros para pedir ayuda, y
    • 2 si no se encuentra nada.
Cuestiones relacionadas