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 a
pasta, b
pasta e x
arquivo.
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 GLOBIGNORE
para 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 NASA
diretó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 extglob
não estiver ativado, ative-o primeiro:
shopt -s extglob