Exclui um diretório no padrão de correspondência 'ls'

11

Estou tentando ls dirs que têm .png arquivos dentro (sem necessidade de recursividade, embora seja extra útil), exceto um. Excluir um diretório, por exemplo,

ls */*.png

funciona bem.

ls (^one)*/*.png

não retorna nenhum stdout. Como faço para isso?

Eu sou cego e canalizo para espeak , então só posso ouvir stdout por enquanto.

    
por Tomas Jankus 24.04.2015 / 21:24

2 respostas

15

Opção 1 - usando apenas ls :
Com o bash globbing estendido ativado ( shopt -s extglob ), você pode fazer:

ls !(one*)/*.png


Opção 2 - combinando ls e grep :

Você pode combinar ls com grep -v

  • por exemplo. %código%


Opção 3 - (o melhor IMO), mas usa ls */*.png | grep -v "one/" não find :

Para pesquisa recursiva de todos os subdiretórios usando ls

find . -type f -name "*.png" -not -path "*/one/*"


Todos os one-liners acima listarão os diretórios com find arquivos enquanto filtram qualquer caminho correspondente a .png ; somente a opção 3 fará isso de forma recursiva.

    
por 24.04.2015 / 21:38
4

Em zsh , coloque setopt extended_glob no seu ~/.zshrc . Em seguida, você pode usar o padrão de caractere curinga ^one para excluir o diretório chamado one .

ls ^one/*.png

Se você quiser recorrer a subdiretórios, use **/ para globalização recursiva. Para excluir o diretório chamado one no nível superior, bem como o diretório de nível superior:

ls ^one/**/*.png

Para excluir arquivos em um subdiretório chamado one , mas não arquivos em subdiretórios dele:

ls **/^one/*.png

Para excluir arquivos em um subdiretório chamado one em qualquer nível, use um padrão de repetição com o operador # em torno da negação:

ls (^one/)#/*.png
    
por 25.04.2015 / 15:47