Delete all files except specified files/folders using command line?
You can use GLOBIGNORE
to set the names that will be ignored while globbing and then use *
to match all other files/directories:
GLOBIGNORE='a:b:x'; rm -r *
Example:
$ 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
Alternately, you can use find
, from the NASA
directory:
find . -maxdepth 1 ! -name '.' ! -regex '.*/\(a\|b\|x\)$' -exec rm -r {} +
Example:
/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
You can use the extended globbing, but the exclamation mark goes before the pattern:
rm -rf NASA/!(a|b|x)
If extglob
is not on, activate it first:
shopt -s extglob