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

我有一个包含大量文件夹和不同文件的文件夹,具有以下结构:

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脚本。

我错过了一个更简单的方法吗? 我怎么能在一个命令中执行此操作?

您可以使用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 

或者,您可以从NASA目录中使用find

 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 

您可以使用扩展的globbing,但感叹号在模式之前

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

如果未启用extglob激活它:

 shopt -s extglob