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
.