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


10

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

如何用Bash删除除A以外的所有子目录?

Answers:


23

Bash扩展了globbing(首先进行测试,然后删除回显):

shopt -s extglob
echo rm -rf !(A)

(在我忘记之前-您可能会禁用CSH样式历史记录的完成功能,在Bash3中,有一个错误而忽略了!(。set + H

如果充满惊喜,则+1 Bash!有时他们像这样很好。
Aleksandr Levchuk

哇,真的很好!可以正常工作。使用shopt | grep ext您可以查看插件是否已启用。
危险89年

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

10

关于什么:

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

这样可以避免其他命令中某些错字。


1
+1做理智的事情,而不是希望工具足够聪明。仍然有一天晚上,当我刚学习Linux时,在进行第一次重新编译之前,我已将内核复制到/ tmp。它没有成功,但是删除了旧文件,所以我说“不费吹灰之力,我有副本”,才发现午夜cron任务已删除/ tmp中超过一个星期的每个文件!我不得不再次重新编译,这次正确了,否则对我而言没有重新启动!
哈维尔2009年

最佳答案发布:)
沃伦2010年

3

就像是

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

应该做。

编辑

真的应该是

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

防止find递归到A以下。


3
但是,这也会删除A下的所有子目录,如A / foo和A / bar,但会保留A / A。
TCampbell,2009年

凉!问题和答案从SO迁移到SF ...但是我在上面的编辑丢失了...
Agnul

最好交换maxdepth并输入如下参数:find。-maxdepth 1 -type d -not -name A -exec rm -ir {} \;
Spawnrider


1

如果您想更加灵活但手动,则可以执行以下操作:

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

这样一来,您就可以进行一般调查。


1

这是一种方法。但是要小心这种事情,它是如此强大以至于只能用于善恶。

查找*-类型d | grep -v“ ^ A” | xargs rm -rf

1

不要像某些人使用-exec和rm那样使用find而不将-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命令{} +'一起使用,或者-delete(如果您的查找支持)。



1

除了前面的示例:

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先。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.