Excluir um diretório no padrão de correspondência `ls`

13

Eu estou tentando lsdirs que possuem .pngarquivos dentro (não há necessidade de recursividade, embora seria mais útil), exceto um. Excluir um diretório, ou seja,

ls */*.png

funciona bem.

ls (^one)*/*.png

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

Eu sou cego e canalizá-lo espeak, então só posso ouvir stdout por enquanto.

Tomas Jankus
fonte
Qual shell você está usando? Seu padrão se parece com um padrão zsh, embora não seja útil, pois não excluiria one(o padrão correto seria ^one/*.png); imprimiria tudo.
Gilles 'SO- stop be evil'

Respostas:

16

Opção 1 - usando apenas ls:
Com os globos bash estendidos ativados ( shopt -s extglob), você pode:

ls !(one*)/*.png


Opção 2 - combinação lse grep:

Você pode combinar lscomgrep -v

  • por exemplo ls */*.png | grep -v "one/"


Opção 3 - (a melhor IMO), mas findnão usa ls:

Para pesquisa recursiva de todos os subdiretórios usando find

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


Todos os one-liners acima listarão diretórios com .pngarquivos enquanto filtram qualquer caminho correspondente one/; somente a opção 3 fará isso recursivamente.

toxefa
fonte
O findcomando não precisa dizer -path "*/one/*"ou -path "./one/*"?
G-Man diz 'Reinstate Monica'
@ G-Man Você está absolutamente certo. Editado acima.
toxefa
Ainda não combinaria ./phone/handset.png?
G-Man diz 'Reinstate Monica'
@ G-Man O que há de errado em combinar .pngs em um diretório chamado phone? Eu pensei que estávamos apenas tentando excluir one?
toxefa
1
Bem, como você o está usando em conexão com -not, isso significa que ele findexclui arquivos em um diretório chamado phone.
G-Man Diz 'Reinstate Monica'
6

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

ls ^one/*.png

Se você deseja recursar em subdiretórios, use **/para globbing recursivo. Para excluir o diretório chamado oneno 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:

ls **/^one/*.png

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

ls (^one/)#/*.png
Gilles 'SO- parar de ser mau'
fonte