O padrão !("file1" | "file2")
corresponde a qualquer arquivo, exceto file1␣
ou ␣file2
, em que ␣
é um espaço. A maneira como você citou é enganosa: é equivalente a !(file1 | file2)
ou !("file1 "|" file2
) '.
Não há como bash combinar um padrão negativo com um padrão positivo para dizer "todos esses, exceto aqueles". Em zsh, você pode escrever
setopt extended_glob
rm /path/to/directory/*.(mp4|zip)~(keep*|1234.zip)
para remover this.mp4
e that.zip
, mas não keep-this.mp4
ou 1234.zip
.
No bash, você pode definir a GLOBIGNORE
variable para excluir certos padrões de todos os jogos.
shopt -s extglob
GLOBIGNORE='keep*:1234.zip'
rm /path/to/directory/*.(mp4|zip)
unset GLOBIGNORE
Como alternativa, você pode usar find
, que permite criar expressões booleanas arbitrariamente complexas.
find /path/to/directory \( -name '*.mp4' -o -name '*.zip' \) ! -name 'keep*' ! -name '1234.zip' -delete
Observe que find
recorre a subdiretórios. Se isso não for desejado, adicione -maxdepth 1
após /path/to/directory
.
Se o seu find
não entender -maxdepth
(é comum, mas não padrão), use -type d -prune -o
. Se seu find
não entender -delete
(mesmo comentário), use -exec rm {} +
.