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 a
carpeta, b
carpeta y x
archivo.
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 GLOBIGNORE
para 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 NASA
directorio:
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 extglob
no está activado, actívelo primero:
shopt -s extglob