删除所有以特定字符串开头的目录

Tho*_*aya 8 linux directory rm

我必须使用什么命令来删除以目录开头的所有graphene-80目录/tmp

我可以在rm命令中添加什么作为选项?

Kus*_*nda 18

graphene-80* 要删除直接在 下/tmp匹配模式的目录,请使用

rm -rf /tmp/graphene-80*/
Run Code Online (Sandbox Code Playgroud)

在这里,尾随/确保仅删除名称与graphene-80*模式匹配的目录(或目录的符号链接),而不是文件等。

要在下面其他位置找到匹配的目录/tmp并删除它们(无论它们在哪里),请使用

find /tmp -type d -name 'graphene-80*' -prune -exec rm -rf {} +
Run Code Online (Sandbox Code Playgroud)

要在删除目录时另外查看目录的名称,请-print在 之前插入-exec

这两个测试-type d-name 'graphene-80*'对具有我们正在查找的名称的目录的测试。从搜索路径中删除-prune找到的目录(我们不想在这些目录被删除时查看它们的内部),最后-exec,通过调用 来执行实际删除rm


解决评论中的问题:“如何删除该目录中的所有文件(而不是目录本身)?”

以下之一:

  • 删除目录后重新创建它们:

    find /tmp -type d -name 'graphene-80*' -prune \
        -exec rm -rf {} \; -exec mkdir {} +
    
    Run Code Online (Sandbox Code Playgroud)

    或者更有效地批量执行这两项操作,

    find /tmp -type d -name 'graphene-80*' -prune \
        -exec sh -c 'rm -rf "$@"; mkdir "$@"' sh {} +
    
    Run Code Online (Sandbox Code Playgroud)

    这样做的好处是命令简单(与下面的命令相比)。

  • 使用一个小的内联 shell 脚本仅删除找到的目录中的名称(文件和目录):

    find /tmp -type d -name 'graphene-80*' -prune -exec bash -O nullglob -O dotglob -c '
        for dirpath do
            rm -rf "$dirpath"/*
        done' bash {} +
    
    Run Code Online (Sandbox Code Playgroud)

    这将执行一个小型内联bash脚本,其中包含批量找到的目录路径名。shell 以nullglobdotglobshell 选项集启动。该nullglob选项用于将不匹配的 shell 模式扩展为,而不是让它们不扩展,并且dotglobshell 选项用于匹配隐藏名称(*默认情况下不匹配隐藏名称)。该脚本迭代给定的目录路径并递归地清空每个目录。

    这样做的好处是它可以充分处理找到的恰好是挂载点的目录路径。缺点是命令的复杂性以及我必须编写所有这些文本来描述它正在做什么的事实(这意味着下一个人可能很难接管脚本的维护)。


Kev*_*ire 5

使用查找命令:

find /tmp -type d -name 'graphene-80*' -delete
Run Code Online (Sandbox Code Playgroud)

使用的参数:

  • -type 仅过滤目录并避免查找文件
  • -name 查找与引号之间定义的模式匹配的文件
  • -delete 删除 find 命令的结果

编辑:清洁器与-delete这篇文章中显示的类似: 查找匹配模板的文件并删除

  • 无法删除。目录不为空 (4认同)