Combinando uma seqüência de símbolos no bash

0

Eu gostaria de listar todos os arquivos do Fortran 90 no bash sem arquivos terminados em _tst.f90 . Minha melhor tentativa até agora é

ls -l ../src/*[!_tst].f90

De acordo com a referência de Bash na correspondência de padrões [!_tst] leva em consideração apenas ocorrências únicas de _ , t e s . É possível dizer bash que _tst deve ser uma seqüência? Os símbolos (_tst) , único '_tst' e aspas duplas"_tst" não funcionam.

    
por mabalenk 25.10.2013 / 11:52

3 respostas

0

Respondendo estritamente à sua pergunta: sim, você pode, mas não funciona.

shopt -s extglob
ls -l ../src/*!(_tst).f90

O problema é que !(...) ficará feliz em corresponder a uma string vazia, portanto, qualquer nome de arquivo foo_tst.f90 terá apenas o * engolindo os sete primeiros caracteres.

Eu não conheço uma maneira básica de fazer isso sem usar o find (1).

No zsh:

setopt extended_glob
ls -ld ../src/*.f90~*_tst.f90

Isso usa o recurso ~ extended_glob, em que A~B resulta em algo correspondente a A que não corresponde a B .

    
por 25.10.2013 / 12:44
0

Se você quiser encontrar todos os arquivos terminados em f90, exceto aqueles que terminam em _tst.f90, use o comando:

find /spath/to/start/directory -name '*.f90' ! -name '*_tst.f90' -print

Edit: Isso desce toda a árvore. Se você quiser se limitar ao diretório atual,

find /spath/to/start/directory -name '*.f90' ! -name '*_tst.f90' -maxdepth 1 -print
    
por 25.10.2013 / 12:28
0

Esta é uma expansão no caminho shopt -s extglob :

shopt -s extglob
ls -l ../src/!(!(*.f90)|*_tst.f90)

que diz ao Bash para corresponder a algo que não corresponde a:

  • não *.f90 , ou seja, qualquer coisa, exceto .f90 arquivos ou

  • _tst.f90 , ou seja, seus arquivos de teste.

que correspondem apenas aos arquivos *.f90 exceto *_tst.f90 .

Ele rapidamente se torna complicado, e o find é uma solução mais extensível para a correspondência complexa de arquivos, mas se você quiser apenas o Bash, construções semelhantes são possíveis.

    
por 25.10.2013 / 12:57

Tags