在 Linux、macOS 以及其他类 Unix 操作系统中,rm
和 rmdir
命令被用于删除文件和目录。 它们的功能类似于 Windows 和 DOS 系统中的 del
和 deltree
命令。 这些命令功能强大,并提供了多种选项。
需要特别注意的是,通过 rm
和 rmdir
命令删除的文件和目录不会被移动到回收站,而是会直接从您的计算机中永久删除。 如果您不慎使用这些命令删除了文件,唯一恢复它们的方法是从备份中进行还原。
如何使用 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
,也可以用于删除目录。 rm
和 rmdir
的区别在于,rmdir
只能删除空目录,而永远不能删除文件。
最基本的使用方式是删除一个空目录。 与 rm
命令类似,您可以向 rmdir
传递多个目录名,或者提供一个目录的路径。
通过将其名称传递给 rmdir
来删除当前目录中的单个目录:
rmdir 目录名
通过将名称列表传递给 rmdir
来删除多个目录:
rmdir 目录名1 目录名2 目录名3
通过指定该目录的完整路径来删除不在当前目录中的目录:
rmdir /路径/到/目录
如果您尝试删除一个非空文件夹,rmdir
会给出错误信息。 在以下示例中,rmdir
成功且静默地删除了 客户端
目录,但它拒绝删除 项目
目录,因为它包含文件。 项目
目录保持不变,其中的文件也保持不变。
当 rmdir
给出“目录非空”的错误时,它会停止处理在命令行上传递给它的目录。 如果您要求它删除四个目录,而第一个目录中包含文件,rmdir
将会给出错误信息并且什么也不做。 您可以使用 --ignore-fail-on-non-empty
选项强制它忽略这些错误,从而继续处理其他目录。
在以下示例中,两个文件夹被传递给 rmdir
,它们分别是 work/reports
和 work/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
该命令按照要求删除了 invoices
和 work
目录。
无论是使用 Bash 还是任何其他 shell,Linux 都提供了灵活而强大的命令,让您能够直接从终端命令行删除目录和文件。 有些人更喜欢围绕终端构建工作流程,而另一些人可能别无选择。 他们可能在没有安装 GUI 的服务器上工作,或者在 Raspberry Pi 等无头系统上进行远程会话。 这些命令对于这部分人来说非常理想。
但无论您偏好哪种工作流程,这些命令都非常适合包含在 shell 脚本中。 如果脚本由 cron 作业触发,它可以帮助自动化日常内务管理任务,例如清理不需要的日志文件。 如果您要使用这种方法,请务必牢记这些命令的强大功能,仔细测试所有操作,并且始终保持最新的备份。