Exclui um padrão do jogo glob

36

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 ?

    
por jake 24.10.2014 / 17:29

4 respostas

41
shopt -s extglob
echo rm foo.!(org)

Isso é "foo". seguido por qualquer coisa que NÃO seja "org"

ref: link

    
por 24.10.2014 / 17:35
15

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.

    
por 28.11.2015 / 19:10
1

Um tubo pode fazer?

ls * | grep -v "foo.org" | xargs -I {} echo {}

(obviamente você pode querer substituir o eco por rm na última cadeia).

    
por 05.07.2018 / 22:01
0

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
    
por 22.04.2017 / 19:48