网站搜索

在 Linux 中删除文件的 8 种方法——以及何时使用每种方法


当一个文件不再有用时,就该删除它了,你可能至少知道一种删除方法。但是,可能有比你意识到的更多的方法,每种方法都有其自身的优点、独特之处以及可以教给我们的东西。

从图形界面到命令行,甚至更底层,了解更多关于删除文件的内容。

使用图形界面文件浏览器

初学者的最佳选择

如果你已经在使用像 GNOME 的文件管理器 Files(Nautilus)这样的文件管理器,你可以很容易地删除文件,通常方法是右键点击文件并选择“移到回收站”。






你也可以将文件拖到垃圾箱文件夹以删除它:

或者,你可以使用键盘快捷键来删除所选文件。在 Nautilus 中,按 Delete 可以将文件发送到回收站,按 Shift + Delete 可以永久删除文件。

在命令行中,使用 rm

你应该在99%的时间里使用的工具

“rm” 是“remove”的缩写,是你几乎每天都会使用的基本 Linux 命令之一。使用其最有用的、可移植的选项时,使用方法如下:

rm [-f | -i] [-drv] file ...

要删除一个文件,运行命令 rm filename。要删除多个文件,可以将它们全部作为参数列出:

rm fileone filetwo filethree

你可以根据需要使用你的 shell 的各种扩展功能来缩写此命令:

rm file*

如果你像这样运行 rm,你需要小心,确保你的通配符模式正好匹配你打算删除的文件。如果你想更谨慎一些,可以使用 -i 选项,在每次删除前进行提示:

unlink 程序

比 rm 稍微安全一些的替代方法

unlink 命令是 rm 的一个高度受限的等价命令。它缺少 rm 的所有选项,并且仅在你传递给它一个参数(一个有效文件)时才有效。

你可以使用 unlink 一次删除一个文件,因为你知道几乎不会出错,所以很安全。

此命令被描述为“删除目录条目”,其名称反映了 Linux 表示文件的方式。磁盘上的每个物理文件可以有多个链接,每个链接都有自己的路径。Unlink 会删除目录条目,但不一定删除底层文件。如果仍然有剩余的链接,文件将继续保留在磁盘上,并可以通过这些链接访问。

使用 find,文件搜索命令

一个比 rm 强大的替代工具

rm 命令可以一次删除许多文件,但即使使用通配符来列出它们,也可能不方便。如果你想删除例如每个只有一个链接且早于某个日期的 .txt 文件,你将需要利用另一个命令 find 的功能。

顾名思义,find 在搜索文件时非常好用,但它也可以对这些文件运行任何命令。这意味着它可以作为 rm 的文件名来源:

find /dir -name ".DS_Store" -exec rm {} \;

请记住,你可以使用 rm 的交互选项作为安全保护网:-exec rm -i {} \;。

某些版本的 find 也支持内置的删除选项,这会方便一些:

find /dir -name ".DS_Store" -delete

find 会严格按顺序处理其参数,所以 -delete 必须放在像 -name 这样的过滤选项之后。同样,如果你想先检查,可以使用 -print 而不是 -delete。

使用垃圾命令

为了安心

在 macOS 上默认安装,并可通过你的包管理器在 Linux 上获得,trash 工具是使用命令行将文件发送到废纸篓的替代方法,而不是使用文件管理器。

最简单地说,trash 是 rm 的直接替代品,所以你可以这样使用它:

trash -v a b c

区别在于垃圾箱在后台的操作。垃圾箱不是删除文件,而是将文件移动到你的垃圾箱文件夹中。请注意,和大多数这些工具一样,垃圾箱支持 -v (--verbose) 选项。它还支持 -s (--stopOnError) 选项,如果任何文件移动失败则以错误退出。

使用 shred -u

像 rm,但更私密

当你删除一个文件时,它就没了,对吗?好吧,如果你使用图形界面或命令行 trash 工具将其移动到垃圾箱,它仍然可以恢复,但 rm、unlink 和类似工具会完全销毁它,对吗?

当涉及到删除文件时,情况并不是那么简单。因为从磁盘上物理移除数据是一项昂贵的操作,你的操作系统通常会采用捷径。你的系统通常不会真正覆盖磁盘上表示该文件内容的所有位,而只是将其标记为已删除。

其结果是删除文件会将其标记为已删除,但原始数据可能仍可恢复。大多数情况下,这没问题,但如果你处理的是额外敏感的数据,就可能成为问题。在这种情况下,你需要一个不仅将文件标记为已删除,而且还会清除原始数据的工具。shred就是这样的工具。

作为 GNU coreutils 的一部分,shred 的默认行为是用随机位覆盖文件的数据。然而,shred -u 会在粉碎文件后删除该文件,这通常是你想要做的。

因为 shred 做的事情远不止 rm,所以运行时间可能更长。对于较大的文件,这种情况会更明显。

Shred不提供保证,因为另一个进程可能已打开文件指针,操作系统的某些部分可能已经缓存了文件的数据,等等。

运行 gio,如果你有的话

如果你需要删除其他设备上的文件

Gio 是一个 GNOME 库,它提供了一个 API,用于通过相同的接口处理虚拟文件系统和本地文件。它为许多常见任务提供了替代方案,即使你没有运行 GNOME 桌面环境,也可以使用命令行 gio 程序。

Gio 相当于 rm 的是 remove 子命令,你可以这样使用它:

gio remove [-f] file ...

请注意,gio 支持的唯一选项是 -f,它可以抑制对不存在文件的错误。另外还有 gio trash,它相当于 trash 命令。

写一个程序

为了终极灵活性

在操作系统级别,文件是通过 unlink 系统调用删除的。在 C 语言中,unistd.h 头文件提供了对此的封装:

#include <unistd.h>

int main() {
    unlink("filename");
}

大多数编程语言提供了一种非常简单的删除文件的方法,通常只需一次函数调用:

Python

os.remove("filename")

去

os.Remove("filename")

Node.js

fs.unlinkSync("filename")

Perl

unlink "filename"

锈

fs::remove_file("filename");

每种方法都可能有用,所以要了解它们全部

在 Linux 上删除文件的方法出乎意料地多。大多数时候,你要么使用图形界面文件管理器,要么在命令行上使用 rm 程序。

但这些替代方案也提供了各自的好处,从隐私到安全以及简单易用性。像往常一样,Linux 给你提供你所需的全部控制,因此了解这些选项非常重要。

相关文章