Tenho a seguinte lista de arquivos:
main.acn main.acr main.alg main.aux main.glg main.glo main.gls main.ist main.lof main.log main.lot main.nlo Saída principal main.pdf main.tex main.toc
Eu quero rm todos os main.*
arquivos, exceto o arquivo main.tex e main.pdf .
Eu tentei, rm main.* !("main.tex","main.pdf")
mas isso não funcionou e removi todos os main.*
sem exceção.
Alguma ideia?
!("main.tex","main.pdf")
corresponde a qualquer coisa que não sejamain.tex,main.pdf
, então provavelmente todos os arquivos no diretório.A chave a notar é que
!(...)
já age como*
, pois ele próprio corresponde a qualquer coisa que não seja uma das coisas dentro. E o separador é|
, não,
.Então,
main.!(tex|pdf)
deve funcionar. Ou!(main.tex|main.pdf)
se você deseja remover todos os arquivos, exceto esses dois, não apenas aqueles com nomes que começam commain.
.Ver:
A rota menos sofisticada é salvar os arquivos que você deseja manter, excluir tudo (o resto) e colocar os arquivos salvos novamente. É também uma solução compatível com POSIX:
Aqui eu escolhi
x
como um arquivo ou diretório que ainda não existe. Você receberá um errorm
que não pode ser excluídox
; isso é bom. Não userm -rf
!Observe que normalmente
rm ./*
irá pular arquivos de ponto.No Bash também existe a
GLOBIGNORE
variável, que pode excluir/remover nomes da lista retornada por um glob. Um exemplo:GLOBIGNORE
pode ser uma lista de expressões (separadas por dois pontos) que descrevem os nomes a serem ignorados, como mostra o exemplo acima. Sua pergunta era sobre a exclusão de um par de nomes de arquivos simples, mas você também pode usar expressões glob:A lista de nomes correspondentes ao glob (
*
nestes exemplos) é avaliada em relação às expressões emGLOBIGNORE
. Os nomes que correspondem a qualquer uma das expressões são removidos da lista. É um recurso útil.Em muitos casos, também é útil usar
export
, como emexport GLOBIGNORE='main.tex:main.pdf'
.Sempre que me deparo com uma situação como essa, faço isso com um pipe:
ls -1 main.* | egrep -v '\.pdf|\.tex' | xargs rm