shopt -s extglob
echo rm foo.!(org)
Isso é "foo". seguido por qualquer coisa que NÃO seja "org"
ref: link
Eu tenho vários arquivos com o mesmo nome de arquivo base. Eu gostaria de remover todos menos um
foo.org #keep
foo.tex #delete
foo.fls #delete
foo.bib #delete
etc
Se eu não precisasse manter um, sei que poderia usar rm foo.*
.
TLDP demonstra ^
para negar uma correspondência. Por tentativa e erro, consegui descobrir que
rm foo.*[^org]
faz o que eu preciso, mas eu realmente não entendo a sintaxe.
Além disso, embora não seja uma limitação no meu caso de uso, acho que esse padrão também ignora foo.o
e foo.or
. Como esse padrão funciona, e como seria um glob que ignora somente foo.org
?
shopt -s extglob
echo rm foo.!(org)
Isso é "foo". seguido por qualquer coisa que NÃO seja "org"
ref: link
No bash, você também pode usar GLOBIGNORE="*.org"; rm -i foo*
.
E unset GLOBIGNORE
quando terminar.
Não é realmente melhor que shopt -s extglob
, mas acho mais fácil de lembrar.
Um tubo pode fazer?
ls * | grep -v "foo.org" | xargs -I {} echo {}
(obviamente você pode querer substituir o eco por rm na última cadeia).
Se você não precisa de um de uma linha, o seguinte também funciona bem.
cp foo.org bar.bu && \
rm foo.* && \
mv bar.bu foo.org