rm !(*.sh)
é uma sintaxe extglob
, o que significa remover todos os arquivos, exceto os que têm a extensão .sh
.
Na sua instância interativa bash
, a opção extglob
do shell está ativada:
$ shopt extglob
extglob on
Agora que seu script está sendo executado em um subshell, é necessário ativar extglob
adicionando isso no início do script:
shopt -s extglob
Assim, seu script parece:
#!/bin/bash
shopt -s extglob
rm -rf -- !(*.sh)
EDITAR:
Para remover todos os arquivos, exceto .sh
extension, use GLOBIGNORE
(como você não deseja habilitar extglob
):
#!/bin/bash
GLOBIGNORE='*.sh'
rm -rf *
Exemplo:
$ ls -1
barbar
bar.sh
egg
foo.sh
spam
$ GLOBIGNORE='*.sh'
$ rm *
$ ls -1
bar.sh
foo.sh