regexp no ksh para extensões tgz, tar.tgz

2

Estou tentando obter um regexp (em ksh) para identificar arquivos apenas com as seguintes extensões: tgz , tar.gz , TGZ e TAR.GZ . Eu tentei vários, mas não consigo fazê-los funcionar. Estou usando este regexp para selecionar apenas arquivos de arquivos com essas extensões para fazer algum trabalho com eles:

if [ -f $myregexp ]; then
   ..... 
fi
    
por user463674 19.07.2011 / 13:35

3 respostas

1

[ -f "$myregexp" ] ou [[ -f $myregexp ]] testa se existe um arquivo chamado exatamente $myregexp . (Observe que, com os colchetes únicos, você precisa das aspas duplas.)

Se você quiser testar a existência de arquivos correspondentes a um padrão glob, não há um caminho direto. Você precisa fazer isso em duas etapas: primeiro, gere a lista de correspondências e, em seguida, teste se essa lista está vazia.

a=( ~(Ni)*.@(tgz|tar.gz) )
if [[ ${#a} -ne 0 ]]; then …

Isso usa vários recursos específicos do ksh:

  • o prefixo ~(N) para gerar uma lista vazia se não houver correspondência;
  • o prefixo ~(i) para fazer correspondência insensível a maiúsculas e minúsculas;
  • a sintaxe @(foo|bar) glob para corresponder a foo ou bar

Aqui está um equivalente do bash. No bash, você obtém expansão vazia de maiúsculas para globs não correspondentes e insensibilidade a maiúsculas e minúsculas das opções; extglob é para a sintaxe @(foo|bar) e outras extensões do ksh glob.

shopt -s nocaseglob nullglob extglob
a=( *.@(tgz|tar.gz) )
if [[ ${#a} -ne 0 ]]; then …

Aqui está um equivalente zsh. A opção extended_glob é necessária para o prefixo (#i) para uma correspondência sem distinção entre maiúsculas e minúsculas. O qualificador (N) glob indica expansão vazia para globs não correspondentes.

setopt extended_glob
a=( (#i)*.(tgz|tar.gz)(N) )
if [[ ${#a} -ne 0 ]]; then …
    
por 19.07.2011 / 14:19
2

Seu exemplo não dá pistas sobre o que a fonte que você está comparando é. Se você quiser listar arquivos no diretório atual, basta agrupar alguns globs assim:

for file in *.tgz *.tar.gz *.TGZ *.TAR.GZ; do
    echo $file
done

Se você quiser testar um nome de arquivo em uma string contra uma partern, tente o seguinte:

if [[ ( $file =~ .*\.(tgz|TGZ|tar\.gz|TAR\.GZ) ) ]]; then
    echo $file
fi

Ou você pode usar uma declaração de caso:

case $file in
    *.tgz|*.tar.gz|*.TGZ|*.TAR.GZ)
        echo $file
        ;;
esac
    
por 19.07.2011 / 13:44
0

Você pode até fazer correspondência insensível a maiúsculas com meras expressões glob:

for f in *.[Tt][Gg][Zz] *.[Tt][Aa][Rr].[Gg][Zz]; do
   echo $f
done
    
por 19.07.2011 / 16:25