![删除以特定字符串开头的所有目录](https://linux22.com/image/127227/%E5%88%A0%E9%99%A4%E4%BB%A5%E7%89%B9%E5%AE%9A%E5%AD%97%E7%AC%A6%E4%B8%B2%E5%BC%80%E5%A4%B4%E7%9A%84%E6%89%80%E6%9C%89%E7%9B%AE%E5%BD%95.png)
我必须使用什么命令来删除graphene-80
该目录下以开头的所有目录/tmp
?
我可以将什么rm
作为选项添加到命令中?
答案1
删除与模式匹配的目录graphene-80*
直属/tmp
, 使用
rm -rf /tmp/graphene-80*/
在这里,尾随/
确保仅graphene-80*
删除名称与模式匹配的目录(或目录的符号链接),而不是文件等。
要在下面其他位置找到匹配的目录/tmp
并删除它们(无论它们在哪里),请使用
find /tmp -type d -name 'graphene-80*' -prune -exec rm -rf {} +
要在删除目录时另外查看目录的名称,请-print
在 之前插入-exec
。
这两个测试-type d
和-name 'graphene-80*'
对具有我们正在查找的名称的目录的测试。从搜索路径中删除-prune
找到的目录(我们不想在这些目录被删除时查看它们的内部),最后-exec
,通过调用 来执行实际删除rm
。
解决评论中的问题:“如何删除该目录中的所有文件(而不是目录本身)?”
以下之一:
删除目录后重新创建它们:
find /tmp -type d -name 'graphene-80*' -prune \ -exec rm -rf {} \; -exec mkdir {} +
或者更有效地批量执行这两项操作,
find /tmp -type d -name 'graphene-80*' -prune \ -exec sh -c 'rm -rf "$@"; mkdir "$@"' sh {} +
这样做的好处是命令简单(与下面的命令相比)。
使用一个小的内联 shell 脚本仅删除找到的目录中的名称(文件和目录):
find /tmp -type d -name 'graphene-80*' -prune -exec bash -O nullglob -O dotglob -c ' for dirpath do rm -rf "$dirpath"/* done' bash {} +
这将执行一个小型内联
bash
脚本,其中包含批量找到的目录路径名。 shell 以nullglob
和dotglob
shell 选项集启动。该nullglob
选项用于将不匹配的 shell 模式扩展为没有什么而不是让它们不展开,并且dotglob
shell 选项用于匹配隐藏名称(*
默认情况下不匹配隐藏名称)。该脚本迭代给定的目录路径并递归地清空每个目录。这样做的好处是它可以充分处理找到的恰好是挂载点的目录路径。缺点是命令的复杂性以及我必须编写所有这些文本来描述它正在做什么的事实(这意味着下一个人可能很难接管脚本的维护)。
答案2
使用寻找命令:
find /tmp -type d -name 'graphene-80*' -delete
使用的参数:
-type
仅过滤目录并避免查找文件-name
查找与引号之间定义的模式匹配的文件-delete
删除 find 命令的结果
编辑:清洁剂与-delete
这篇文章中所示的一样:
查找与模板匹配的文件并删除
答案3
要仅删除名称匹配的空目录graphene-80*
,可以
find /tmp -type d -name "graphene-80*" -exec rmdir {} +
或者
find /tmp -type d -name "graphene-80*" -delete
(rmdir
GNU find 应该会给你非空的错误。)
要删除目录及其内容:
find /tmp -type d -name "graphene-80*" -exec rm -r {} \; -prune
(如果有嵌套的匹配目录,-exec rm +
您可能会收到错误;如果没有,则可能会出现错误,因为它会尝试下降到刚刚删除的目录。)rm
-prune
find
答案4
您可以使用以下命令:更新
find /tmp -type d -name 'graphene-80*' -prune -exec rm -rf {} +