Lista de arquivos que correspondem a um padrão, mas ignoram arquivos que correspondem a outro padrão?

12

Digamos que eu tenha um diretório com os arquivos a1, a2, a3, b1, b2, b3. Eu só quero corresponder arquivos que começam com a , mas não contêm 3 . Eu tentei ls -I "*3" *a* , mas ele retorna a1 a2 a3 , mesmo que eu não queira que ele corresponda a a3 . Isso é possível com ls ?

    
por Steven 21.10.2015 / 21:07

4 respostas

14

Apenas:

shopt -s extglob  
ls a!(*3*)
  • shopt -s extglob ativa a globalização estendida.
  • a corresponde ao% iniciala
  • !() nega a correspondência dentro do () ...
    • *3* , que é 3 e qualquer coisa antes ou depois.
$ touch 1 2 3 a1 a2 a3 b1 b2 b3 aa1 aa2 aa3 a2a a3a
$ ls a!(*3*)
a1  a2  a2a  aa1  aa2
    
por 21.10.2015 / 21:27
8

As respostas existentes indicam a melhor maneira de fazer isso com globs; Vou incluir isso porque, na maioria dos casos, find é uma opção melhor se você quiser fazer scripts ou processamento adicional:

$ find . -maxdepth 1 -name 'a*' -not -name '*3*'
./a1
./a2

Você pode alimentar a resposta para xargs para ações fáceis ou para um while read para coisas mais complicadas.

    
por 21.10.2015 / 22:14
4

Uma maneira fácil é

  • para listar todos os arquivos que correspondem a a*
  • exclua todas as linhas que contêm 3

O comando do UNIX é

ls -1 a* | grep -v 3

ls -1 mostra um arquivo por linha.

grep normalmente encontra linhas que correspondem a um padrão, mas com -v esse comportamento é invertido, ou seja, o grep localiza linhas que não correspondem a esse padrão.

    
por 21.10.2015 / 21:12
3

Com zsh , usando o operador% glob_da_a% glob :

setopt extendedglob
print -rl -- a*~*3*

Com ~ gnu você pode usar duas opções ls :

ls -I '[^a]*' -I '*3*'

o primeiro ignora todos os nomes de arquivos que não iniciam com --ignore e o segundo ignora nomes de arquivos que contêm a

    
por 21.10.2015 / 21:26