Excluir todos os arquivos, exceto arquivos/pastas especificados, usando a linha de comando?

Excluir todos os arquivos, exceto arquivos/pastas especificados, usando a linha de comando?

Eu tenho uma pasta contendo muitas pastas e arquivos diferentes com as seguintes estruturas:

NASA
├── a
│   ├── doc1
│   ├── doc2
│   ├── doc3
│   ├── folder1
│   └── folder2
├── b
│   ├── doc1
│   ├── doc2
│   ├── doc3
│   ├── folder1
│   └── folder2
├── c
│   ├── doc1
│   ├── doc2
│   ├── doc3
│   ├── folder1
│   └── folder2
├─ x
├─ y
└─ z     

Quero excluir o conteúdo da pasta ( NASA/), exceto pastas e arquivos especificados.

Por exemplo, quero manter apasta, bpasta e xarquivo.

tenteiesta solução :

 rm !(a/) -r NASA/

E (conforme explicado na respostaaqui):

find NASA/ -type f ! -iname "x" -delete

Mas isso não é muito simples e preciso usar um script bash.

Estou faltando uma maneira mais fácil? Como posso fazer isso em um único comando?

Responder1

Você pode usar GLOBIGNOREpara definir os nomes que serão ignorados durante o globbing e depois usar *para corresponder a todos os outros arquivos/diretórios:

GLOBIGNORE='a:b:x'; rm -r *

Exemplo:

$ tree 
.
├── a
│   ├── 1
│   ├── 2
│   └── 3
├── b
│   ├── 1
│   ├── 2
│   └── 3
├── c
│   ├── 1
│   ├── 2
│   └── 3
├── x
├── y
└── z

/NASA$ GLOBIGNORE='a:b:x'

/NASA$ rm -r *

/NASA$ tree 
.
├── a
│   ├── 1
│   ├── 2
│   └── 3
├── b
│   ├── 1
│   ├── 2
│   └── 3
└── x

Como alternativa, você pode usar find, no NASAdiretório:

find . -maxdepth 1 ! -name '.' ! -regex '.*/\(a\|b\|x\)$' -exec rm -r {} +

Exemplo:

/NASA$ tree 
.
├── a
│   ├── 1
│   ├── 2
│   └── 3
├── b
│   ├── 1
│   ├── 2
│   └── 3
├── c
│   ├── 1
│   ├── 2
│   └── 3
├── x
├── y
└── z


/NASA$ find . -maxdepth 1 ! -name '.' ! -regex '.*/\(a\|b\|x\)$' -exec rm -r {} +


/NASA$ tree 
.
├── a
│   ├── 1
│   ├── 2
│   └── 3
├── b
│   ├── 1
│   ├── 2
│   └── 3
└── x

Responder2

Você pode usar o globbing estendido, mas o ponto de exclamação vaianteso padrão:

rm -rf NASA/!(a|b|x)

Se extglobnão estiver ativado, ative-o primeiro:

shopt -s extglob

informação relacionada