假设在当前目录下有多个子目录,其中一个被称为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
。