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