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 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.
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 {} +
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.
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
Tags shell pattern-matching