使用命令行删除除指定文件/文件夹之外的所有文件?

使用命令行删除除指定文件/文件夹之外的所有文件?

我有一个文件夹,其中包含许多文件夹和不同的文件,其结构如下:

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

我想删除文件夹(NASA/)中除指定文件夹和文件之外的内容。

例如我想保留a文件夹、b文件夹和x文件。

我试过此解决方案

 rm !(a/) -r NASA/

并且(如答案中解释的那样这里):

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

但这不是很直接,我必须使用 bash 脚本。

我是否缺少更简单的方法?如何用单个命令完成此操作?

答案1

您可以使用它GLOBIGNORE来设置在匹配过程中将被忽略的名称,然后使用它*来匹配所有其他文件/目录:

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

例子:

$ 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

或者,您也可以使用以下目录find中的NASA

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

例子:

/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

答案2

您可以使用扩展的通配符,但感叹号会模式:

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

如果extglob没有打开,请先激活它:

shopt -s extglob

相关内容