Gostaria de excluir todos os subdiretórios e arquivos de um determinado diretório, exceto os diretórios que correspondem a um determinado padrão:
example_dir/model-*/gen-*/share/**
Configuração geral: gerei vários modelos (> 100), cada um com >=1 geração(s). Dentro desses modelos (por exemplo, example_dir/model-0/gen-0/
) existem vários diretórios e subdiretórios.
Resultado desejado: gostaria de excluir todos os diretórios e arquivos, exceto aqueles que correspondem:
example_dir/model-*/gen-*/share/
Dentro de cada modelo/geração/ seria algo assim?:
rm -rf !(share)
Responder1
Não tenho certeza se entendi totalmente sua pergunta e não tenho certeza de quais perguntas complementares fazem sentido. Uma coisa que estou me perguntando é se você tem uma árvore de diretórios como
example_dir
|-- model-0
| |-- gen-0
| | |-- share
| | |-- trash
| | | |-- more_trash
| | |-- file123.txt
| |-- grandfather
|-- platypus
foo
é suficiente excluir (e seu conteúdo ) example_dir/model-0/gen-0/trash
ou você também deseja excluir
example_dir/model-0/grandfather
e example_dir/platypus
? foo
E que tal example_dir/model-0/gen-0/file123.txt
?
Se você deseja excluir trash
(e seu conteúdo) e file123.txt
, tente
#!/bin/bash
shopt -s extglob
echo rm -rf example_dir/model-*/gen-*/!(share)
Se você deseja excluir trash
(e seu conteúdo), mas preservar file123.txt
, tente
#!/bin/bash
shopt -s extglob
echo rm -rf example_dir/model-*/gen-*/!(share)/
(adicionando um /
depois !(share)
).
De qualquer forma, examine a saída com atenção e, se tiver certeza de que é isso que deseja, execute o comando novamente sem a extensão echo
.
Se você também deseja excluir diretórios de nível superior diferentes de example_dir
diretórios de primeiro nível que não correspondem ao model-*
padrão ou diretórios de segundo nível que não correspondem ao gen-*
padrão, edite sua pergunta para esclarecer.