Pop directorio actual hasta que se encuentre el archivo específico

Pop directorio actual hasta que se encuentre el archivo específico

Estoy interesado en escribir un script con el siguiente comportamiento:

  1. Vea si existe un archivo, build.xml, en el directorio actual; de ser así, ejecute un comando proporcionado a través de argumentos al script.
  2. De lo contrario, abra el directorio actual y mire el padre. Ir a 1.

El script finalizará una vez que encontremos el archivo o lleguemos a la raíz. Además, una vez que finaliza el script y el control regresa al usuario, quiero que el directorio actual sea aquel donde se encontraba inicialmente el script.

No estoy muy familiarizado con los scripts de shell, pero cualquier ayuda/orientación será muy apreciada.

Respuesta1

En bash, puedes lograr esto, por ejemplo, así:

mkt.sh

curr=`pwd`
file_name=build.xml
echo "Current directory: $curr"
while [ "$curr" != "/" ]; do
  echo "Processing: $curr"
  file="$curr/$file_name"
  if [ -f "$file" ]; then
    echo "Found at: $file, running command..."
    cd "$curr"
    "$@"
    exit
  fi
  curr="`dirname \"$curr\"`"
done
echo "$file_name not found."

Ejecución de muestra:

~$ cd /tmp
/tmp$ ls mkt.sh
mkt.sh
/tmp$ mkdir -p a/b/c/d
/tmp$ echo hello > a/build.xml
/tmp$ find a
a
a/build.xml
a/b
a/b/c
a/b/c/d
/tmp$ cd a/b/c/d
/tmp/a/b/c/d$ /tmp/mkt.sh cat build.xml
Current directory: /tmp/a/b/c/d
Processing: /tmp/a/b/c/d
Processing: /tmp/a/b/c
Processing: /tmp/a/b
Processing: /tmp/a
Found at: /tmp/a/build.xml, running command...
hello
/tmp/a/b/c/d$ rm /tmp/a/build.xml 
/tmp/a/b/c/d$ r/tmp/mkt.sh cat build.xml
Current directory: /tmp/a/b/c/d
Processing: /tmp/a/b/c/d
Processing: /tmp/a/b/c
Processing: /tmp/a/b
Processing: /tmp/a
Processing: /tmp
build.xml not found.

Además, una vez que finaliza el script y el control regresa al usuario, quiero que el directorio actual sea aquel donde se encontraba inicialmente el script.

No es necesario hacer esto en bash. Los scripts secundarios no pueden cambiar la contraseña actual del proceso bash principal. Prueba esto:

$ cd /tmp
$ echo "cd /usr" > a.sh
$ chmod u+x a.sh
$ pwd
/tmp
$ cat a.sh
cd /usr
$ ./a.sh
$ pwd
/tmp

Como puede ver, la contraseña actual no cambió, aunque el script sí lo hizo cd /usrdentro de ella.

información relacionada