Os curingas podem especificar correspondências negativas?

0

Em bash é possível usar curingas para especificar "todos os arquivos no diretório atual EXCETO [arquivos que correspondam a um padrão específico (curinga)]"? Por exemplo, "todos os arquivos que não correspondem a * ~"

De forma mais geral, é possível qualificar uma especificação de arquivo curinga com uma segunda especificação, filtragem ou negação?

    
por RashaMatt 18.07.2014 / 08:44

2 respostas

0

Claro. Digamos que você queira que todos os arquivos contenham a string "foo" em seu nome, mas nenhum que também contenha "bar". Então você quer

foo1
foo2

Mas você não quer

 foobar1

Você pode usar globbing simples para fazer isso da seguinte forma:

for f in foo!(bar)*; echo $f; done

ou mais

ls foo[^bar]*

Para mais informações, consulte: link Cuidado, os dois métodos têm suas armadilhas. Você provavelmente está melhor usando find .

    
por 18.07.2014 / 09:00
0

Obrigado à bjanssen por apontar o extglob shopt do bash, que permite esse tipo de globbing.

Na% man_de% manpage:

If the extglob shell option is enabled using the shopt builtin, several
extended pattern matching operators are recognized. In the following 
description, a pattern-list is a list of one or more patterns separated 
by a |.  Composite patterns may be formed using one or more of the following
sub-patterns:

          ?(pattern-list)
                 Matches zero or one occurrence of the given patterns
          *(pattern-list)
                 Matches zero or more occurrences of the given patterns
          +(pattern-list)
                 Matches one or more occurrences of the given patterns
          @(pattern-list)
                 Matches one of the given patterns
          !(pattern-list)
                 Matches anything except one of the given patterns

Então, para responder à minha pergunta "como especificar todos os arquivos que não correspondem a * ~ ":

!(*~)

ou, sem a necessidade de bash :

*[^~]

E, mais geralmente, respondendo a última parte da minha pergunta:

The GLOBIGNORE shell variable may be used to restrict the set of file names
matching a pattern. If GLOBIGNORE is set, each matching file name that also
matches one of the (colon-separated) patterns in GLOBIGNORE is removed from
the list of matches.
    
por 19.07.2014 / 00:26