Esta é a solução simples que você provavelmente deve usar:
mv filename.gif filename.gif.keep
rm *.gif
mv filename.gif.keep filename.gif
Não há nada de especial na extensão .keep , isso faz com que o nome do arquivo não termine em .gif .
Se você não deve renomear o arquivo (e existem scripts situações em que isso é importante):
for X in *.gif; do
if [ "$X" != "filename.gif" ]; then
rm "$X"
fi
done
Ou você pode escrevê-lo mais curto assim:
for X in *.gif; do [ "$X" != "filename.gif" ] && rm "$X"; done
Você pode preferir usar find ; é muito poderoso, você pode considerá-lo mais legível, e lida melhor com nomes estranhos de arquivos com caracteres como * neles .
find . -maxdepth 1 -not -name 'filename.gif' -name '*.gif' -delete
Eu usei o operador -not para facilitar a leitura, mas se a conformidade com POSIX for importante - se você ' não está usando o GNU find, ou se é para um script que você pretende redistribuir para outros ou rodar em uma variedade de sistemas - você deve usar o operador ! :
find . -maxdepth 1 ! -name 'filename.gif' -name '*.gif' -delete
Uma coisa útil sobre find é que você pode modificar facilmente o comando para distinção entre maiúsculas e minúsculas, para que ele encontre e exclua arquivos com extensões como .GIF também:
find . -maxdepth 1 -not -name 'filename.gif' -iname '*.gif' -delete
Por favor, note que usei -iname no lugar de -name para o padrão de pesquisa *.gif , mas eu não usei para filename.gif . Presumivelmente, você sabe exatamente para o que seu arquivo é chamado, e -iname corresponderá a letras maiúsculas alternativas não apenas na extensão , mas em qualquer lugar no nome do arquivo.
Todas essas soluções excluem apenas arquivos que residem imediatamente no diretório atual . Eles não excluem arquivos não contidos no diretório atual e não excluem arquivos que residem em subdiretórios do diretório atual.
Se você deseja excluir arquivos em todos os lugares contidos no diretório atual (ou seja, inclusive em subdiretórios e em subdiretórios desses subdiretórios e assim por diante - arquivos contidos no diretório atual ou em qualquer um de seus descendentes), use find sem maxdepth -1 :
find . -not -name 'filename.gif' -name '*.gif' -delete
Cuidado com isso!
Você também pode definir outros valores com -maxdepth . Por exemplo, para excluir arquivos no diretório atual e seus filhos e netos, mas não mais profundamente:
find . -maxdepth 3 -not -name 'filename.gif' -name '*.gif' -delete
Apenas certifique-se de nunca colocar -delete antes das outras expressões! Você verá que eu sempre coloquei -delete no final. Se você colocá-lo no começo, ele seria avaliado primeiro, e todos os arquivos em . (incluindo arquivos que não terminam em .gif e arquivos em sub-sub-sub ... diretórios de . ) seriam excluídos!
Para mais informações , consulte as páginas de manual de bash e sh e para os comandos usados em estes exemplos: mv , rm , [ e (especialmente) find .