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

6

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     

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

Por exemplo, eu quero manter a pasta a , b folder e x file.

Eu tentei esta solução :

 rm !(a/) -r NASA/

E (conforme explicado na resposta aqui ):

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

Mas isso não é muito simples e eu tenho que usar um script bash.

Estou sentindo falta de um jeito mais fácil? Como posso fazer isso em um único comando?

    
por hg8 23.10.2015 / 12:05

2 respostas

14

Você pode usar GLOBIGNORE para definir os nomes que serão ignorados durante a globbing e, em seguida, 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 diretório NASA :

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
    
por heemayl 23.10.2015 / 12:24
16

Você pode usar o agrupamento estendido, mas o ponto de exclamação fica antes do padrão:

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

Se extglob não estiver ativado, ative-o primeiro:

shopt -s extglob
    
por choroba 23.10.2015 / 12:18