Eu tenho vários arquivos com o mesmo nome de arquivo base. Eu gostaria de remover todos, exceto um
foo.org #keep
foo.tex #delete
foo.fls #delete
foo.bib #delete
etc
Se eu não precisasse ficar com um, sei que poderia usá-lo rm foo.*
.
O 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 é que este trabalho padrão, e o que seria um glob que ignora única foo.org
parece?
rm foo.*[^org]
remove todos os arquivos cujo último caractere não é nemo
,r
oug
, portanto, tambémfoo.foo
não corresponderia.Regular Expression
. Você deve ter cuidado com seus personagens de agrupamento. Usando suportes que você especificou um significado classe de personagem que você exclua todos os arquivos que tinham uma extensão com as letraso
,r
oug
em qualquer ordem. Use parênteses para criar um grupo e preservar a ordem dos caracteres.foo.*[^org]
corresponderá a qualquer nome de arquivo que comece comfoo.
um ou mais caracteres após o ponto em que o último caractere não é o, r ou g. Então, seria igualfoo.orb
, mas nãofoo.org
oufoo.or
oufoo.o
. A resposta de GlennJackman mostra como habilitar os recursos estendidos de correspondência de padrões para negar uma correspondência.Respostas:
Isso é "foo". seguido por qualquer coisa que não seja "org"
ref: https://www.gnu.org/software/bash/manual/bashref.html#Pattern-Matching
fonte
@()
para uma lista de padrões: stackoverflow.com/a/217208/3779853No bash, você também pode usar
GLOBIGNORE="*.org"; rm -i foo*
.E
unset GLOBIGNORE
quando terminar.Não é realmente melhor do que
shopt -s extglob
, mas acho mais fácil lembrar.fonte
( GLOBIGNORE="*.org"; rm -i foo* )
GLOBIGNORE="*foo*:*bar*"
Um cano pode fazer?
(obviamente, você pode substituir echo por rm na última cadeia).
fonte
ls -1
deve ser mais confiável para garantir que todos os arquivos sejam tratadosgrep
separadamenteO OP estava muito próximo:
embora neste caso o
*
seja desnecessário.fonte