当前位置: 首页>>技术问答>>正文


在bash中,如何删除目录中的所有文件和子目录而不删除目录?

, ,

问题描述

是否有命令删除目录中的所有文件和子目录而不删除目录?

例如,如果我有一个子目录”1″,”2″,”3″目录”dontDeleteMe”和每个子目录中有几张图片,我怎么能删除子目录”1″,”2″和”3″并在他们的所有文件,而不删除父目录”dontDeleteMe” ?

最佳解决思路

要删除目录中的所有内容而不删除目录,请键入:

rm -rfv dontDeleteMe/*

请注意,/*部分非常重要。如果在*之前放置一个空格,它将删除当前目录中的所有文件。

另外,在同一命令中使用rm-r*时要非常小心。它们可能是一个灾难性的组合。

更新:好的,我意识到你是否有隐藏/点文件[文件名在开头有点,e.x。 .hidden]然后这将使这些文件完好无损。

实际上,原始问题最简单的解决方案是:rm -rfv dontDeleteMe && mkdir dontDeleteMe

另一个是使用find-exec选项或管道到xargs(下面):

find dontDeleteMe/* -print0 | xargs -0 rm -rv

次佳解决思路

rm -r ./*不能始终工作的唯一原因是因为您可以拥有*不匹配的隐藏文件和/或文件夹。

为此,bash提供了一个选项,使*匹配所有内容,甚至是隐藏的对象:

cd dont-delete-me
shopt -s dotglob
rm -r ./*

如果继续使用执行上述命令的shell,将dotglob重置为其默认(未设置)状态会很有用:

shopt -u dotglob 

第三种解决思路

开放式终端(Ctrl + Alt + T)蚂蚁类型:

find somedir -mindepth 1 -delete

这将匹配somedir及其(大)子项中的所有文件和目录,包括”hidden”点文件,但由于-mindepth 1而不包括somedir,然后是-delete

第四种思路

find /dontDeleteMe/ -xdev -depth -mindepth 1 -exec rm -Rf {} \;

使用xdev选项仅删除设备边界内的文件。

第五种思路

要删除(在终端中)除名为”dontdelete”的基目录之外的所有文件和子目录:

rm -rf dontdelete/*

第六种思路

您可以将find-delete标志一起使用:

find dontDeleteMe/* -delete

/*很重要,因为它告诉find只搜索INSIDE名为”dontDeleteMe”的文件夹。

还要确保-delete标志位于find命令的末尾。

第七种思路

rm -rf  directory/{.*,/*}

说什么:

删除所有以。开头的文件。在”directory”和所有其他文件中。

虽然Neftas友好地注意到这个解决方案并不安全!

更安全的解决方案是:

 rm -rf directory/!(.|..)

参考资料

本文由Ubuntu问答整理, 博文地址: https://ubuntuqa.com/article/1799.html,未经允许,请勿转载。