删除除一个以外的所有子目录

假设在当前目录下有多个子目录,其中一个被称为A.

如何删除除B之外的所有子目录?

Bash扩展了globbing(首先testing,然后删除回声):

shopt -s extglob echo rm -rf !(A) 
 find -maxdepth 1 -type d -not -name A -not -name "." -exec rm -ir {} \; 

关于什么:

 mv A /tmp/ rm * -rf mv /tmp/A . 

这样可以避免其他命令中input错误的一些“可疑”。

就像是

 find . -type d -not -name A -exec rm -ir {} \; 

应该做。

编辑

应该是真的

 find . -type d -maxdepth 1 -not -name A -exec rm -ir {} \; 

防止find下面的答案

我通常是通过编写一个ls命令来实现这个function的。 我不是在unix机器,但像这样的东西:

ls -lda“[^ A]”

一旦你做对了,pipe它到一个命令

ls -lda“[^ A]”| xargs rm -rf

随意编辑上面,如果我有我的正则expression式错误…

如果你想更灵活,但手动,你可以做:

 ls > /tmp/foo edit /tmp/foo as you like xargs -a /tmp/foo rm -r 

这样你可以做普通的武器。

这是一种方法。 小心这种事情,但它太强大了,只能用于善恶。

find* -type d |  grep -v“^ A”|  xargs rm -rf

不要使用find,因为有些人用-exec和rm显示,而不传递-print0来查找和-0到xargs。 它会弄乱与文件名空格或换行符:

 $ mkdir 'foo foo' $ mkdir foo$'\n'foo $ find . -type d -exec rm -ir {} \; rm: cannot remove directory `.' rm: remove directory `./foo\nfoo'? y find: `./foo\nfoo': No such file or directory rm: remove directory `./foo foo'? y find: `./foo foo': No such file or directory 

而是使用find -print0与xargs -0,'-exec command {} +',或者 – 如果你的find支持,则删除它。

除了之前的例子:

 find -maxdepth 1 -type d -not -name A -not -name "." -exec rm -ir {} \; 

你也可以这样做:

 find some/subdir -mindepth 1 -maxdepth 1 -type d -not -name A -exec rm -ir {} \; 

避免首先要cd some/subdir