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

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

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

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
相关文章推荐:
(0)

相关推荐