问题描述
是否有命令删除目录中的所有文件和子目录而不删除目录?
例如,如果我有一个子目录”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/!(.|..)