Como resolver o final correto de um caminho?

Como resolver o final correto de um caminho?

Eu tenho uma variável shell contendo esse caminho

/usr/share/man/man1/bitmap.1

PODERIA haver um arquivo chamado bitmap.1, mas também pode ser bitmap.1.z, bitmap.1.gz, bitmap.1.Z.

Agora quero passar o arquivo real para uma função e ao mesmo tempo resolver o arquivo correto, como

function process {
    # do something
}

path="/usr/share/man/man1/bitmap.1"

process ${path}.(z|Z|gz) # here the shell shall resolve the real filename

Existe uma maneira de fazer isso com elegância ou tenho que testar se bitmap.1, bitmap.1.z etc. sai e depois passar esse arquivo para a função ???


Esqueci de mencionar que estou restrito ao Bourne-Shell, então não há Brace Expansion disponível -,-.

Responder1

Você ainda pode fazer o globbing no Bourne Shell

for f in ${given-path}*; do
process $f
done

É uma boa ideia fazer o máximo possível de scripts de shell, limitando-se à sintaxe do shell Bourne; que maximiza a portabilidade. Em muitos casos, também melhora a velocidade.

Responder2

Se você conhece a lista de extensões possíveis, você pode fazer:

process ${path}{,.Z,.Z,.gz}

Responder3

Acredito que Christian está no caminho certo. Se você tiver certeza de pelo menos uma parte do seu caminho, usar o globbing interno do Bash produzirá quaisquer arquivos que correspondam ao seu padrão.

Por exemplo, tenho uma função em meu .profile que uso frequentemente para arquivar arquivos de log compactados em gzip e em texto simples:

function mscat {
  is_gzip="\.gz$"

  for file in $@; do
    if [[ "$file" =~ $is_gzip ]]; then
      zcat $file
    else
      cat $file
    fi
  done
}

Que eu chamaria assim:

mscat /var/log/ncftpd/sess.2010*

Como o globbing pode produzir mais de um resultado, sua função de 'processo' deve ser capaz de agir com base em vários argumentos. No meu exemplo, você pode ver como faço isso iterando cada argumento em $@.

Responder4

quando você tem apenas um arquivo, você pode usar o bash globbingprocess ${path}*

informação relacionada