it-swarm-pt.tech

Listar arquivos que não correspondem a um padrão?

Veja como é possível listar todos os arquivos que correspondem a um padrão no bash:

ls *.jar

Como listar o complemento de um padrão? ou seja, todos os arquivos que não correspondem * .jar?

54
paislee
ls | grep -v '\.jar$'

por exemplo.

53
Michael Krelin - hacker

Use a correspondência estendida de padrões no estilo egrep.

ls !(*.jar)

Está disponível a partir de bash-2.02-alpha1. Primeiro deve ser ativado com

shopt -s extglob

A partir do bash-4.1-alpha, existe uma opção de configuração para habilitá-lo por padrão.

70
Christian

Regra de expansão do bash pouco conhecida:

ls !(*.jar)
33
ccarton

O POSIX define expressões de colchetes não correspondentes, para que possamos permitir que o Shell expanda os nomes dos arquivos para nós.

ls *[!j][!a][!r]

Isso tem algumas peculiaridades, mas pelo menos é compatível com qualquer Shell unix.

18
stefanct

Com uma versão apropriada de find, você pode fazer algo assim, mas é um pouco exagerado:

find . -maxdepth 1 ! -name '*.jar'

find localiza arquivos. O . argumento especifica que você deseja iniciar a pesquisa a partir de ., ou seja, o diretório atual. -maxdepth 1 informa que você deseja pesquisar apenas um nível, ou seja, o diretório atual. ! -name '*.jar' procura todos os arquivos que não correspondem ao regex *.jar.

Como eu disse, é um pouco exagerado para este aplicativo, mas se você remover o -maxdepth 1, você pode procurar recursivamente todos os arquivos que não são jar ou o que você possui com facilidade.

15
Dan Fego

E se você quiser excluir mais de uma extensão de arquivo, separe-as com um pipe |, Como ls test/!(*.jar|*.bar). Vamos tentar:

$ mkdir test
$ touch test/1.jar test/1.bar test/1.foo
$ ls test/!(*.jar|*.bar)
test/1.foo

Olhando para as outras respostas, talvez você precise shopt -s extglob Primeiro.

2
James Brown

Uma solução seria ls -1|grep -v '\.jar$'

2
fge

Se o seu ls o suportar (man ls) use o --hide=<PATTERN> opção. No seu caso:

$> ls --hide=*.jar

Não é necessário analisar a saída de ls (porque é muito ruim) e pode ser dimensionada para não mostrar vários tipos de arquivos. Em algum momento, eu precisava ver quais arquivos gerados sem origem, sem objeto e sem libtool estavam em um diretório (confuso):

$> ls src --hide=*.{lo,c,h,o}

Funcionou como um encanto.

2
haavee

Outra abordagem pode estar usando ls -I sinalizador (ignorar padrão).

ls -I '*.jar'
1
Divyanshu Srivastava