Linux rmdir 命令:如何删除空目录

在 Linux 中,rmdir 命令用于删除空目录。它会保留包含文件或子目录的目录,因此可以在保留内容的同时删除空目录。

删除空目录

指定要删除的目录路径。相对路径是从当前工作目录解析的,因此在运行命令之前,请使用pwd和ls -la检查位置和目标。

rmdir empty-dir

空目录通常会在不输出的情况下被删除。如果目录包含文件或子目录,则不会被删除,并会出现如Directory not empty的错误。错误信息取决于系统语言。被删除的目录通常不会被移动到回收站,因此请先确认目标。

如果指定多个目录,它将尝试删除每一个。即使某些目录因为不为空而删除失败,其他目标仍可能被删除,所以不应将此操作视为完全成功或完全取消的操作。

rmdir first-dir second-dir

自己试一试

在一个不与现有文件重叠的位置进行以下练习。如果 rmdir-practice 已存在,请选择另一个名称,如果目录创建失败,不要执行下一个命令。如果使用不同的名称,请在下面的命令中将 rmdir-practice 替换为该名称。

mkdir rmdir-practice

如果创建成功,使用以下命令进入练习目录,并创建空目录和包含文件的目录。

cd rmdir-practice
mkdir empty busy
touch busy/example.txt

empty 是空的,busy 包含文件。尝试按顺序删除这两个目录。

rmdir empty
rmdir busy

第一个命令删除了 empty。第二个命令失败,因为 busy 不是空的,文件仍然存在。你可以使用下一个命令来检查甚至隐藏的项目。

ls -la busy

输出中的 . 和 .. 指的是当前目录和父目录。如果还有其他文件或子目录,则它不是空的。以下的 -p 练习也在该目录下进行。在删除练习文件时,先检查目标。

-p 选项用于删除到父目录为止

-p 或 --parents 试图从指定目录依次删除到父目录的目录。每个目录当时必须为空。你可以在练习目录中按如下方式进行检查。

mkdir -p a/b/c
rmdir -p a/b/c

如果没有其他内容,它们将按顺序 c、b、a 被删除。如果父目录中还有其他文件,删除下级目录可能成功,但删除父目录可能会失败。因此,在运行之前,请确保整个路径确实是要删除的。完成练习后,通过 cd .. 返回到父目录。

显示操作并忽略非空目录

-v 或 --verbose 显示有关正在处理的目录的消息。检查错误消息以确定删除是否实际发生。

rmdir -v empty-dir

GNU rmdir 的 --ignore-fail-on-non-empty 会忽略由于目录不为空而导致的删除失败。目录或其内容不会被删除。以下命令从练习目录的父目录执行。

rmdir --ignore-fail-on-non-empty rmdir-practice/busy

此选项仅在目录不为空时忽略它们。它不是用于忽略其他错误的选项,例如路径不存在或权限不足。如果只发生被忽略的失败,退出状态可能显示为成功,因此不要仅根据退出状态判断所有目录都已删除。你可以在 GNU rmdir 手册 中查看该选项的详细行为。

检查删除失败时的情况

  • 非空: 将 directory 替换为 ls -la directory 中的实际路径以检查隐藏文件和子目录。在常见的 ls 中,以点开头的项目可能不可见。
  • 权限问题: 检查目标及其父目录的权限、所有权和文件系统状态。删除通常需要父目录的写入和搜索权限,也可能存在其他限制。
  • 路径或目标问题: 检查名称和当前位置。指向目录的符号链接与目录本身不同,因此请使用 ls -ld 检查。

rmdir * 允许 shell 将当前目录中的多个名称传递给命令。文件也可以包含在内,通常不包括隐藏名称,因此最好先使用 ls -la 检查目标,并指定所需的目录。如果你需要删除包含文件的目录,则不能使用 rmdir 删除,文件删除应在查看内容后单独决定。