Pop current directory até encontrar um arquivo específico

1

Estou interessado em escrever um script com o seguinte comportamento:

  1. Veja se um arquivo, build.xml, existe no diretório atual, se assim for, execute um comando fornecido por meio de argumentos para o script.
  2. Se não, pop o diretório atual e olhe para o pai. Vá para 1.

O script terminaria assim que encontrarmos o arquivo ou chegarmos à raiz. Além disso, uma vez que o script termina e o controle volta ao usuário, eu quero que o diretório atual seja aquele em que o script era inicialmente l

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

    
por edarroyo 14.04.2012 / 03:38

1 resposta

1

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

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

Also, once the script finishes and control comes back to the user I want the current directory to be that one where the script was initially l

Não há necessidade de fazer isso no bash. Scripts filhos não podem alterar o pwd atual do processo bash pai. Tente 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 cd /usr dentro dele.

    
por 14.04.2012 / 06:47