出于好奇,为什么通过 SSH 调用删除 Linux(我使用的是 Ubuntu)中的文件夹rm -rf somefolder
比从 GUI 中删除文件夹(右键单击,然后选择“移至废纸篓”)要快得多?我要删除的文件夹每个都包含大约 100 个图像文件,在 GUI 中删除文件夹可能需要几分钟,而 rm -rf 可以立即运行。这两个操作是否真的能达到相同的效果,还是只rm -rf
删除了文件的链接?
答案1
您在问题中没有说明这一点,但我怀疑您的 GUI 基于某种 filesystem-over-ssh 功能。这可能会减慢速度,因为每个低级操作(打开目录、读取目录、取消链接文件 1、取消链接文件 2、... 关闭目录)都作为单独的命令通过 ssh 通道传递。
当您从远程机器上的 shell 提示符运行时rm -rf x
,通过网络传递的唯一内容是您用来输入rm -rf x
和 的按键Enter。 (这些按键确实会因网络协议标头而变得有些臃肿,但它们仍然相当小。)低级操作由rm
远程端的程序执行,直接与远程端的内核对话,因此自然速度更快。
ssh 的设计初衷是提供一个 shell 接口(名字应该能说明问题)。附加在它上面的其他东西效率较低。
filemanager-over-ssh 实现可以优化递归删除情况,只需要求服务器运行rm -rf
。我不知道他们中是否有人这样做过。
答案2
您正在使用 ssh:// URL 和 sftp 协议通过“nautilus”文件管理器或类似程序连接到远程系统。
我的 nautilus 版本拒绝将这样的远程目录移动到本地垃圾箱。将远程目录树移动到本地垃圾箱会很慢,它必须先下载所有文件,然后才能删除它们。
我的 nautilus 只是删除文件。sftp 协议直到今年早些时候(2012 R1)才具有“递归删除”功能。您没有使用这个较新的 sftp 系统,nautilus 可能还不知道它。因此,文件管理器必须列出所有文件,然后一次删除一个。它会收到每个文件的确认消息,表示删除已完成,然后再处理下一个文件。因此,删除文件的最短时间就像您与服务器的正常 ping 时间一样(或更糟)。
这种一次一个的远程删除比运行rm -rf /whatever
甚至rm -vrf /whatever
通过正常的 ssh 连接要慢得多。我正在删除 gcc 源代码作为测试用例,估计这 28300 个文件需要 40 分钟。nautilus 仅使用 2% 的 CPU,因此绘制 GUI 显然不受 CPU 限制。
这个问题与 GUI 无关,而是由于(旧)sftp 协议的一个弱点:没有递归删除功能。但是,这就是我使用命令行的原因!没有一个有自尊心的黑客会为此等待 40 分钟!!
如果使用类似 的工具,文件管理器可以相当快速地删除文件,同时显示正在删除的文件rm -vrf /whatever
。某些服务器提供 sftp 访问权限,但不提供完整的 ssh 访问权限。Nautilus 似乎假设了最坏的情况,并且仅使用 sftp。