Pop o diretório atual até que um arquivo específico seja encontrado

Pop o diretório atual até que um arquivo específico seja encontrado

Estou interessado em escrever um script com o seguinte comportamento:

  1. Veja se existe um arquivo, build.xml, no diretório atual; em caso afirmativo, execute um comando fornecido por meio de argumentos ao script.
  2. Caso contrário, abra o diretório atual e observe o pai. Vá para 1.

O script terminaria assim que encontrássemos o arquivo ou alcançássemos a raiz. Além disso, quando o script terminar e o controle voltar para o usuário, quero que o diretório atual seja aquele onde o script foi inicialmente l

Não estou muito familiarizado com scripts de shell, mas qualquer ajuda/orientação será muito apreciada.

Responder1

No bash, você pode conseguir isso, por exemplo:

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."

Execução de amostra:

~$ 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.

Além disso, quando o script terminar e o controle voltar para o usuário, quero que o diretório atual seja aquele onde o script foi inicialmente l

Não há necessidade de fazer isso no bash. Os scripts filhos não podem alterar o pwd atual do processo bash pai. Experimente isto:

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

Como você pode ver, o pwd atual não mudou, mesmo que o script tenha mudado cd /usrdentro dele.

informação relacionada