Citando man 7 glob
:
An expression "[!...]" matches a single character, namely any character
that is not matched by the expression obtained by removing the first '!' from it.
(Thus, "[!]a-]" matches any single character except ']', 'a' and '-'.)
Ênfase na parte de caractere único aqui, []
não pode ser usado para strings inteiras no Bash Pattern Matching.
bash
pode ser usada para combinar strings, mas não há como (Eu sei) para negá-los. Por exemplo,
1.{gif,csv,mp3}
é expandido para
1.gif 1.csv 1.mp3
não importa se esses arquivos existem.
Como o wchargin apontou, shopt
pode ser usado para habilitar operadores estendidos de correspondência de padrões, sendo um deles !()
. Depois de executar shopt -s extglob
, por exemplo,
1.!(gif|csv|mp3)
é expandido para
1.jpg 1.bmp 1.png
se esses arquivos existirem no diretório atual. Para mais informações, leia man bash
(seção EXPANSÃO / Expansão do nome do caminho) e Expansão do nome do tráfego (globbing) .
Para o que você está tentando fazer, eu sempre uso find
, que oferece a negação e muito mais, por exemplo. da seguinte maneira:
find . -maxdepth 1 -type f ! -name "*.gif" -a ! -name "*.csv" -a ! -name "*.mp3"
Isso apenas lista as descobertas, se você quiser removê-las basta anexar a opção -delete
ao final do comando. Como sempre com a remoção de ações: Sempre verifique cuidadosamente primeiro .
find
oferece uma tonelada de opções úteis muito bem explicadas por man find
.