Lendo um diretório no shell script

1

Eu quero ler um diretório numerado que está sob um caminho, em uma variável no shell script. Os caminhos são algo assim:

.../releases/R1/...
.../releases/R2/...
.../releases/R3/...

Cada vez que o script é executado, eu quero ler o diretório R (R3 neste caso) numerado mais recente em uma variável e depois passar isso como um argumento para algumas funções dentro do script. Como devo fazer isso?

    
por coffeMug 22.02.2013 / 10:57

3 respostas

2

É mais fácil se você estiver usando o zsh, graças aos seus qualificadores : [-1] para manter a última correspondência e n para usar a classificação numérica para que R9 seja anterior a R10 . Você também pode aproveitar seu padrão <-> glob para corresponder aos números.

last_release=(releases/R<->(n[-1]))
if (($#last_release == 0)); then
  echo 1>&2 "Fatal error: no release available"
  exit 2
fi

Com apenas ferramentas portáteis, o método mais fácil é transferir a classificação numérica para sort . Se você tiver apenas nomes de arquivos “domesticados” no diretório releases (somente caracteres ASCII, sem caracteres de controle, sem espaço em branco), filtrar a saída de ls é uma maneira prática de gerar a lista de nomes de arquivos. >

set_last_release () {
  set -- $(ls releases | sed -n 's/^R\([0-9][0-9]*\)//p' | sort -rn)
  if [ $# -eq 0 ]; then
    echo 1>&2 "Fatal error: no release available"
    exit 2
  fi
  last_release=releases/R$1
}

Se você usar zeros à esquerda em seus números de lançamento, poderá confiar na classificação interna do shell. Observe que não há uma maneira portátil de corresponder apenas aos nomes de arquivo que consistem em R seguido por um ou mais dígitos; em ksh, você pode usar releases/R+([0-9]) , e você também pode usar isso no bash se você colocar shopt -s extglob no início do seu script (ele deve estar em vigor quando a função é analisada e quando é executada). / p>

set_last_release () {
  set -- releases/R[0-9]*
  if [ "$1" = 'releases/R[0-9]*' ]; then
    echo 1>&2 "Fatal error: no release available"
    exit 2
  fi
  eval last_release=\$$#
}
    
por 22.02.2013 / 18:32
1

e quanto a isso:

DIRECTORY=$(ls .../releases | tail -n 1)

Isso funciona desde que os nomes dos diretórios possam ser classificados como strings. por exemplo, um '2' seria depois de um '12', a menos que você nomeie o '2' na verdade '02'

    
por 22.02.2013 / 11:20
0

Basta tentar isso:

for dir in releases/R*[0-9]/; do
   echo "$dir"
done
    
por 22.02.2013 / 14:06