Como posso especificar um padrão de shell que exclua determinados arquivos?

3

Por exemplo, eu quero remover todos os arquivos em um diretório, exceto o arquivo .tar de onde eles vieram. Eu poderia fazer algo como:

find . -maxdepth 0 | grep -v '.tar$' | xargs rm -f

mas existe uma maneira de fazer isso apenas usando rm e correspondência de padrões de shell ? Sinta-se à vontade para especificá-lo usando bash ou outros shells comumente disponíveis, ou com opções estendidas, se isso não puder ser feito com baunilha sh .

Encontrei uma pergunta semelhante sobre evitando diretórios e subdiretórios com find , mas não com padrões de shell.

    
por Jared Oberhaus 16.07.2009 / 20:50

4 respostas

8

Você pode fazer isso com globbing estendido.

shopt -s extglob

então

rm !(file.tar)

Isso funciona no bash 3.2.39 no mínimo

    
por 16.07.2009 / 21:06
0

Eu não acho que o que você deseja alcançar seja possível.

Você pode simplificar o comando que você tem:

find . -maxdepth 0 -not -name '*.tar' -exec rm -f {} +
    
por 16.07.2009 / 20:53
0

Tente isso talvez

find . -maxdepth 0 \! -name '*.tar' -exec echo rm -f {} \;

Remova o eco que precede o rm se parecer correto.

Yes, but is there a shell pattern?

Eu não penso assim. Pelo menos não nas versões do bash que eu conheço. Nas outras respostas, parece que as versões mais recentes podem ser mais funcionais.

    
por 16.07.2009 / 20:52
0

Editar:

Leia a pergunta para rápido ... Mas para continuar com o meu post de qualquer maneira ... :-) Se você quiser apagar todos os arquivos mas arquivos tar recursivamente com zsh:

rm -rf **/^*.tar(.)

Não recursivo:

rm -rf ^*.tar(.)

O novo bash 4.0 e zsh suporta globalização recursiva. Para ativá-lo no bash use:

shopt -s globstar

Funciona como:

 rm -rf **/*.tar.gz
    
por 16.07.2009 / 21:02