¿Hay alguna forma de encontrar un file en una búsqueda recursiva inversa?

Entonces, digo que estoy en un directory que está dentro de una estructura de files, como

/home/cory/projects/foo/bar/bash/baz 

Sé que, ya sea en la carpeta actual baz o en una de las carpetas que están sobre mí (como home , cory , projects , foo , bar o bash ), hay un file llamado happy . ¿Cómo puedo encontrar ese file sin search muchas carpetas adicionales?

 #!/bin/bash function upsearch () { test / == "$PWD" && return || test -e "$1" && echo "found: " "$PWD" && return || cd .. && upsearch "$1" } 

Esta function uploadá desde el directory actual. Tenga en count que es una function y cambiará el directory al atravesar. Se detendrá en el directory, donde encontrará el file, y se dirigirá a la raíz / si no.

Es posible que desee cambiarlo a una secuencia de commands en lugar de una function, y tal vez retroceder, si el file no se encuentra en el directory raíz.

Si nunca quieres cd al directory:

 upsearch () { slashes=${PWD//[^\/]/} directory="$PWD" for (( n=${#slashes}; n>0; --n )) do test -e "$directory/$1" && echo "$directory/$1" && return directory="$directory/.." done } 

Esto conducirá a resultados como /home/cory/a/b/c/../../../happy si el file está en / home / cory /. Si necesita un path limpio, podría hacer algo

 cd "$directory" echo "$PWD" cd - 

en el exito

Echa un vistazo a las opciones -mindepth y -maxdepth para find .

find no recorrerá los directorys hacia atrás, pero puede abordarlo en la dirección normal y limitar la profundidad de la búsqueda.

Por ejemplo:

 find /home /home/cory /home/cory/projects /home/cory/projects/foo /home/cory/projects/foo/bar /home/cory/projects/foo/bar/bash -maxdepth 0 -name happy -print 

Mejoré un poco la solución de @ user-unknown ahorrando el directory actual, realizando una testing arbitraria y restaurando el directory original antes de regresar con la respuesta. Es más flexible porque puedes probar cualquier cosa.

También proporciono un segundo argumento opcional que dice qué tan alto ir.

https://gist.github.com/1577473

 #!/bin/bash # Use this script instead of ~/.rvm/bin/rvm-prompt # and the output of rvm-prompt will show up in your command prompt # only if you are in a Ruby project directory. # see http://stackoverflow.com/a/4264351/270511 # and http://unix.stackexchange.com/questions/13464/is-there-a-way-to-find-a-file-in-an-inverse-recursive-search upsearch () { the_test=$1 up_to=$2 curdir=`pwd` result=1 while [[ "`pwd`" != "$up_to" && "`pwd`" != '/' ]]; do if eval "[[ $the_test ]]"; then result=0 break fi cd .. done cd $curdir return $result } if upsearch '-e Gemfile || ! -z "$(shopt -s nullglob; echo *.gemspec *.rb)"' ; then ~/.rvm/bin/rvm-prompt fi