我有一个文件夹,其中包含许多文件夹和不同的文件,其结构如下:
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