Como manter uma extensão de arquivo e remover outras?

0

Eu tenho muitas extensões de arquivo no diretório: .tr0 , .scs , .mt0 , .ic0 , .log , .st0 , .pa0 .

Eu quero manter apenas .tr0 e .scs e excluir todas as outras extensões.

Existe alguma maneira eficaz em vez de:

rm *.mt0 *.ic0 *.log *.st0 *.pa0 
    
por Trong Nhan Nguyen 24.05.2018 / 06:37

2 respostas

2

POSIXLY:

find . ! \( -name '*.tr0' -o -name '*.scs' \) -type f -exec echo rm -f {} +

(Remove echo quando você quer executar o comando)

Se o seu find support -delete :

find . ! \( -name '*.tr0' -o -name '*.scs' \) -type f -delete

O comando acima funcionará recursivamente. Se você quiser apenas no diretório atual:

find . ! -name . -prune ! \( -name '*.tr0' -o -name '*.scs' \) -type f
    
por 24.05.2018 / 06:41
2

Em um shell que permite padrões de globbing estendido, como bash com a opção extglob habilitada ( shopt -s extglob ) ou ksh93 :

rm ./*.!(tr0|scs)

O padrão de globbing de concha estendido !(pattern-list) corresponde a qualquer coisa, exceto aos padrões especificados no | -delimited pattern-list .

Observe que o padrão também corresponde aos nomes dos diretórios se contiverem pontos, mas como rm não remove diretórios por padrão, isso resultaria apenas em algumas mensagens de erro.

Para resolver isso, é necessário usar um loop, testando cada nome correspondente para garantir que ele se refira a um arquivo normal:

for name in ./*.!(tr0|scs); do
    [ -f "$name" ] && rm "$name"
done
    
por 24.05.2018 / 07:25