如何在 Linux 终端中删除文件和目录

在 Linux、macOS 以及其他类 Unix 操作系统中,rmrmdir 命令被用于删除文件和目录。 它们的功能类似于 Windows 和 DOS 系统中的 deldeltree 命令。 这些命令功能强大,并提供了多种选项。

需要特别注意的是,通过 rmrmdir 命令删除的文件和目录不会被移动到回收站,而是会直接从您的计算机中永久删除。 如果您不慎使用这些命令删除了文件,唯一恢复它们的方法是从备份中进行还原。

如何使用 rm 删除文件

最基本的使用方式是删除当前目录下的单个文件。 您需要键入 rm 命令,加上一个空格,然后输入您想要删除的文件名。

rm 文件名_1.txt

如果目标文件不在当前工作目录下,您需要提供该文件的完整路径。

rm ./路径/到/文件/文件名_1.txt

您也可以向 rm 命令传递多个文件名。 这样做会删除所有指定的文件。

rm 文件名_2.txt 文件名_3.txt

通配符可以用于批量选择要删除的文件。 * 代表多个字符,而 ? 代表单个字符。 例如,以下命令将删除当前工作目录下所有的 png 图像文件。

rm *.png

以下命令将删除所有扩展名为单个字符的文件。 例如,它会删除 File.1 和 File.2,但不会删除 File.12。

rm *.?

如果文件被设置为写保护,系统会在删除前提示您确认。 您需要输入 y (yes) 或 n (no),然后按 Enter 键来响应。

为了降低使用带有通配符的 rm 命令的风险,可以使用 -i (interactive) 选项。 这会要求您逐个确认每个文件的删除操作。

rm -i *.dat

-f (force) 选项则与交互式相反。 即使文件被设置为写保护,它也不会提示确认,而是直接删除。

rm -f 文件名

如何使用 rm 删除目录

要删除空目录,请使用 -d (directory) 选项。 您可以在目录名中使用通配符 (*?),就像在文件名中一样。

rm -d 目录名

提供多个目录名会删除所有指定的空目录。

rm -d 目录名1 目录名2 /路径/到/目录名3

要删除非空目录,请使用 -r (recursive) 选项。 需要注意的是,这将递归地删除目录及其包含的所有文件和子目录。

rm -r 目录名1 目录名2 目录名3

如果目录或文件被写保护,系统会提示您确认删除。 要删除非空目录并抑制这些提示,可以同时使用 -r (recursive) 和 -f (force) 选项。

rm -rf 目录名

这里需要特别小心。 错误的 rm -rf 命令可能导致数据丢失甚至系统故障。 这是一个高风险操作,谨慎操作是最好的策略。 为了了解目录结构以及 rm -rf 命令将要删除的文件,可以使用 tree 命令。

如果您使用的是 Ubuntu 或其他基于 Debian 的发行版,可以使用 apt-get 将这个软件包安装到您的系统中。 在其他 Linux 发行版上,请使用您对应的 Linux 发行版的软件包管理工具。

sudo apt-get install tree

执行 tree 命令会生成一个易于理解的目录结构图,以及运行该命令的目录下的文件列表。

tree

您还可以向 tree 命令提供一个路径,使其从文件系统中的另一个目录开始构建目录树。

tree 路径/到/目录

rm 命令还具有 --one-file-system--no-preserve-root--preserve-root 等选项,但仅建议高级用户使用。 如果操作不当,您可能会意外删除所有系统文件。 查阅该命令的手册页以获取更详细的信息。

如何使用 rmdir 删除目录

还有一个命令,名为 rmdir,也可以用于删除目录。 rmrmdir 的区别在于,rmdir 只能删除空目录,而永远不能删除文件。

最基本的使用方式是删除一个空目录。 与 rm 命令类似,您可以向 rmdir 传递多个目录名,或者提供一个目录的路径。

通过将其名称传递给 rmdir 来删除当前目录中的单个目录:

rmdir 目录名

通过将名称列表传递给 rmdir 来删除多个目录:

rmdir 目录名1 目录名2 目录名3

通过指定该目录的完整路径来删除不在当前目录中的目录:

rmdir /路径/到/目录

如果您尝试删除一个非空文件夹,rmdir 会给出错误信息。 在以下示例中,rmdir 成功且静默地删除了 客户端 目录,但它拒绝删除 项目 目录,因为它包含文件。 项目 目录保持不变,其中的文件也保持不变。

rmdir 给出“目录非空”的错误时,它会停止处理在命令行上传递给它的目录。 如果您要求它删除四个目录,而第一个目录中包含文件,rmdir 将会给出错误信息并且什么也不做。 您可以使用 --ignore-fail-on-non-empty 选项强制它忽略这些错误,从而继续处理其他目录。

在以下示例中,两个文件夹被传递给 rmdir,它们分别是 work/reportswork/quotes--ignore-fail-on-non-empty 选项已被包含在命令中。 work/reports 文件夹中有文件,因此 rmdir 无法删除它。 --ignore-fail-on-non-empty 选项强制 rmdir 忽略错误,并转到它需要处理的下一个文件夹,即 work/quotes。 这是一个空文件夹,因此 rmdir 将其删除。

以下是使用的命令:

rmdir --ignore-fail-on-non-empty work/reports /work/quotes

您可以使用 -p (parents) 选项来删除目录及其父目录。 这个技巧有效,是因为 rmdir 从目标目录开始,然后向上遍历到父目录。 该父目录现在应该是空的,因此它可以被 rmdir 删除,并且这个过程会逐步向上回溯到 rmdir 接收的路径。

在以下示例中,传递给 rmdir 的命令是:

rmdir -p work/invoices

该命令按照要求删除了 invoiceswork 目录。

无论是使用 Bash 还是任何其他 shell,Linux 都提供了灵活而强大的命令,让您能够直接从终端命令行删除目录和文件。 有些人更喜欢围绕终端构建工作流程,而另一些人可能别无选择。 他们可能在没有安装 GUI 的服务器上工作,或者在 Raspberry Pi 等无头系统上进行远程会话。 这些命令对于这部分人来说非常理想。

但无论您偏好哪种工作流程,这些命令都非常适合包含在 shell 脚本中。 如果脚本由 cron 作业触发,它可以帮助自动化日常内务管理任务,例如清理不需要的日志文件。 如果您要使用这种方法,请务必牢记这些命令的强大功能,仔细测试所有操作,并且始终保持最新的备份。