deepblue_86 Asked: 2018-09-20 04:55:42 +0800 CST2018-09-20 04:55:42 +0800 CST 2018-09-20 04:55:42 +0800 CST 递归删除所有子目录,除了几个[重复] 772 main_directory 包括 0001 0102 0203 ... 子目录。子目录包括很多目录。例如,我需要删除所有子目录,除了几个名称为“abc”、“bcd”和“123”的子目录。 如何使用命令进行删除处理? command-line rm 2 个回答 Voted Best Answer xenoid 2018-09-20T05:52:15+08:002018-09-20T05:52:15+08:00 快速而肮脏,但非常有效: shopt extglob # possibly already there shopt globstar # not often the default rmdir ./**/!(abc|def) # rinse and repeat 慢动作: extglob启用 bash 扩展模式(包括类似!(abc|def)的意思(除了abcor之外的任何东西def) globstar**匹配任何级别的目录 所以./**/!(abc|def)将匹配所有未调用的内容abc或def(我假设您已经删除了文件,否则使用稍微不同的模式您也可以rm使用文件 [*]) 由于目录是自上而下列出的rmdir,因此顶层的 将在删除较低级别之前出现,这就是您可能必须重复该命令几次的原因。 更经典的搭配find 您还可以使用find(-depth首先处理子目录): find . -depth -type d \( \! -name 'abc' -a \! -name 'def' \) -exec rmdir {} \; 但是如您所见,如果您要忽略多个目录,则该命令将相当冗长。 [*]rm ./**/!(abc|def)/*.txt例如 Jeff 2018-09-20T05:50:52+08:002018-09-20T05:50:52+08:00 我认为你最好的选择是使用find 我相信这个命令会做你想做的事。 find /path/to/dir/ -not -path "*/abc*" -not -path "*/bcd*" -not -path "*/123*" -type f -delete 但我建议在没有-deleteor 的情况下运行它,type f -delete以便您可以看到正在删除的内容。或者甚至在一组测试目录上运行它,以确保它在运行您的重要文件之前执行您认为的操作。 有关如何使用此方法和其他方法的更多信息,find请参阅以下问题 https://unix.stackexchange.com/questions/87258/delete-all-files-except-in-a-certain-subdirectory-with-寻找 编辑: 为了消除关于使用的一些困惑-type f而不是-type d,如果你尝试一下,你会发现它实际上做了OP所要求的。该-type d标志实际上导致文件和目录的顺序以不同的顺序列出。因此,在delete删除目录中的文件之前尝试删除目录(不允许这样做)。因此,要使用该-type d标志,必须颠倒列出文件的顺序,这是可能的,但似乎也是一个不需要的步骤,因为该type -f标志实际上可以删除文件和目录。
快速而肮脏,但非常有效:
慢动作:
extglob
启用 bash 扩展模式(包括类似!(abc|def)
的意思(除了abc
or之外的任何东西def
)globstar
**
匹配任何级别的目录./**/!(abc|def)
将匹配所有未调用的内容abc
或def
(我假设您已经删除了文件,否则使用稍微不同的模式您也可以rm
使用文件 [*])rmdir
,因此顶层的 将在删除较低级别之前出现,这就是您可能必须重复该命令几次的原因。更经典的搭配
find
您还可以使用
find
(-depth
首先处理子目录):但是如您所见,如果您要忽略多个目录,则该命令将相当冗长。
[*]
rm ./**/!(abc|def)/*.txt
例如我认为你最好的选择是使用
find
我相信这个命令会做你想做的事。
但我建议在没有
-delete
or 的情况下运行它,type f -delete
以便您可以看到正在删除的内容。或者甚至在一组测试目录上运行它,以确保它在运行您的重要文件之前执行您认为的操作。有关如何使用此方法和其他方法的更多信息,
find
请参阅以下问题 https://unix.stackexchange.com/questions/87258/delete-all-files-except-in-a-certain-subdirectory-with-寻找编辑:
为了消除关于使用的一些困惑
-type f
而不是-type d
,如果你尝试一下,你会发现它实际上做了OP所要求的。该-type d
标志实际上导致文件和目录的顺序以不同的顺序列出。因此,在delete
删除目录中的文件之前尝试删除目录(不允许这样做)。因此,要使用该-type d
标志,必须颠倒列出文件的顺序,这是可能的,但似乎也是一个不需要的步骤,因为该type -f
标志实际上可以删除文件和目录。