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

hg8*_*hg8 7 command-line bash

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

NASA
?
??? a
?   ??? doc1
?   ??? doc2
?   ??? doc3
?   ??? folder1
?   ??? folder2
?
??? b
?   ??? doc1
?   ??? doc2
?   ??? doc3
?   ??? folder1
?   ??? folder2
?
??? c
?   ??? doc1
?   ??? doc2
?   ??? doc3
?   ??? folder1
?   ??? folder2
?
?? x
?? y
?? z     
Run Code Online (Sandbox Code Playgroud)

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

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

我试过这个解决方案

 rm !(a/) -r NASA/
Run Code Online (Sandbox Code Playgroud)

和(在答案解释这里):

find NASA/ -type f ! -iname "x" -delete
Run Code Online (Sandbox Code Playgroud)

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

我错过了更简单的方法吗?如何在单个命令中执行此操作?

cho*_*oba 18

您可以使用扩展的通配符,但感叹号位于模式之前

rm -rf NASA/!(a|b|x)
Run Code Online (Sandbox Code Playgroud)

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

shopt -s extglob
Run Code Online (Sandbox Code Playgroud)


hee*_*ayl 17

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

GLOBIGNORE='a:b:x'; rm -r *
Run Code Online (Sandbox Code Playgroud)

例子:

$ 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
Run Code Online (Sandbox Code Playgroud)

或者,你可以使用find,从NASA目录:

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

例子:

/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
Run Code Online (Sandbox Code Playgroud)