Como posso usar '*' para capturar tudo com exceções

6

Por exemplo, tenho arquivos nomeados

A_1.txt A_t_1.txt A_ts_1.txt A_tsa_1.txt

em um diretório ~/admin/packages/ .

Estou construindo um loop for para globting em A_1.txt

for f in ~/admin/packages/*_1.txt

É óbvio que isso pode potencialmente se tornar um desses arquivos.

Especificamente, gostaria de usar um comando "exception" (se existir) para informar glob a qualquer arquivo, desde que ele não tenha um t , s , a before _1.txt .

EDIT: eu esqueci de mencionar que eu tenho o caminho armazenado como uma variável.

PROJECT="~/admin/packages/*_1.txt"

for f in ${PROJECT}...
    
por ozarka 10.02.2016 / 12:24

4 respostas

10

Você pode fazer isso usando o seguinte padrão extglob em bash :

!(*t|*s|*a)_1.txt

Ativar extglob primeiro (se não ativado) por:

shopt -s extglob

Então você pode fazer:

for f in ~/admin/packages/!(*t|*s|*a)_1.txt; do ##Something; done

Exemplo:

$ echo *_1.txt
A_1.txt Ab_1.txt A_t_1.txt A_ts_1.txt A_tsa_1.txt

$ shopt -s extglob

$ echo !(*t|*s|*a)_1.txt
A_1.txt Ab_1.txt

Encurtado (graças ao caos ):

!(*[tsa])_1.txt
    
por 10.02.2016 / 12:36
4

Você pode definir seu PROJECT var como ~/admin/packages/*[^tsa]_1.txt

PROJECT="~/admin/packages/*[^tsa]_1.txt"

Se você puder modificá-lo.

    
por 10.02.2016 / 12:40
4

Use uma instrução case para eliminar as exceções, assim:

for f in ${PROJECT}; do
    case "$f" in *[tsa]_1*) continue;; esac

    # ... actual work here ...
done
    
por 10.02.2016 / 15:55
1

(no bash) A resposta exata para o seu pedido é usar GLOBIGNORE :

Ao executar este comando:

LESS=+/'^ *GLOBIGNORE' man bash

leia:

GLOBIGNORE
A colon-separated list of patterns defining the set of filenames to be ignored by pathname expansion. If a filename matched by a pathname expansion pattern also matches one of the patterns in GLOBIGNORE, it is removed from the list of matches.

Então, definindo GLOBIGNORE da seguinte forma:

$  ls *
A_1.txt  A_t_1.txt  A_ts_1.txt  A_tsa_1.txt
$ GLOBIGNORE=*t_1.txt:*s_1.txt:*a_1.txt
$ ls *
A_1.txt

Depois disso, você pode restaurar GLOBIGNORE para esvaziar com unset GLOBIGNORE .

    
por 14.02.2016 / 02:42