¿Eliminar todos los archivos excepto los archivos/carpetas especificados usando la línea de comando?

¿Eliminar todos los archivos excepto los archivos/carpetas especificados usando la línea de comando?

Tengo una carpeta que contiene muchas carpetas y diferentes archivos con las siguientes estructuras:

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

Quiero eliminar el contenido de la carpeta ( NASA/), excepto las carpetas y archivos especificados.

Por ejemplo, quiero conservar acarpeta, bcarpeta y xarchivo.

Lo intentéesta solución :

 rm !(a/) -r NASA/

Y (como se explica en la respuestaaquí):

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

Pero esto no es muy sencillo y tengo que usar un script bash.

¿Me estoy perdiendo una manera más fácil? ¿Cómo puedo hacer esto en un solo comando?

Respuesta1

Puede utilizar GLOBIGNOREpara establecer los nombres que se ignorarán durante la globalización y luego utilizar *para hacer coincidir todos los demás archivos/directorios:

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

Ejemplo:

$ 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

Alternativamente, puedes usar find, desde el NASAdirectorio:

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

Ejemplo:

/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

Respuesta2

Puedes usar el globo extendido, pero el signo de exclamación desaparece.antesel patrón:

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

Si extglobno está activado, actívelo primero:

shopt -s extglob

información relacionada