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