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}*