Como excluir um arquivo de um comando com o ZSH?

4

Dado este conteúdo do diretório:

one.file
two.file
three.file

no bash, quando eu entro

rm *.file !(two)

apenas one.file e three.file são excluídos. Como posso fazer isso no ZSH?

    
por yPhil 27.06.2014 / 17:06

2 respostas

6

Eu estava interessado na resposta também, e uma rápida pesquisa transformou este artigo sobre globbing no zsh artigo sobre globbing no zsh . Os destaques:

  • ^ age como uma negação. Por exemplo, ls ^two.file listará apenas um arquivo e três arquivos.
  • Você pode combinar ^ e * . Por exemplo, ls ^two* listará qualquer coisa que não comece com "dois"
  • Você pode usar parênteses para fazer correspondências mais complexas. Por exemplo, ls (^two).file listará qualquer coisa que não inicie com "dois" e termina em "arquivo".
por 27.06.2014 / 17:25
2

Se você quiser usar a sintaxe ksh ls !(two).file , basta ativar a opção KSH_GLOB em zsh:

$ setopt KSH_GLOB
$ ls -1 !(two).file
one.file
three.file

Mas o zsh fornece outras técnicas de globbing poderosas, ativadas pela opção EXTENDED_GLOB . Para uma lista completa, leia a seção GERAÇÃO DE FILENAME em man zshexpn . Mais relevantes para a questão são esses operadores:

  • ^x corresponde a qualquer coisa, exceto ao padrão x , portanto, no seu caso, ls -1 ^two.file
  • x~y é mais poderoso, pois corresponde a qualquer coisa que corresponda ao padrão x , mas não corresponde a y , portanto, ls -1 *~two.file . O especial é que você pode usar outro padrão de globbing para x , por exemplo

    $ ls -1 *.file~two*
    one.file
    three.file
    

    Isso não é possível com o operador ^ , que é nesse caso equivalente a *~ :

    $ ls -1 *.file^two*
    one.file
    three.file
    two.file
    
por 28.06.2014 / 14:21