有没有办法检测是否apt-get update
需要运行?
似乎无论何时apt-get update
运行,它都会下载最新的列表,即使我已经拥有它们,并且如果我已经有最新的列表,我想避免下载列表。
答案1
/etc/apt/sources.list
您可以从和中的所有源中提取 URL /etc/apt/sources.list.d/*
,然后将相应远程存储库中的文件时间戳与ctimes
您在/var/lib/apt/lists
...中的文件的时间戳进行比较,但在我看来,这会比再次下载这些文件花费更长的时间(至少在我的连接上,50MB 可以非常快地处理)。
答案2
您的说法不正确:apt update
不获取已在最新版本下载的目录文件;让我们看看:
首次运行
apt update
:… Get:33 http://deb.debian.org/debian sid/main DEP-11 48x48 Icons [3,683 kB] Get:34 http://deb.debian.org/debian sid/main DEP-11 64x64 Icons [7,474 kB] Fetched 16.1 MB in 4s (4,496 kB/s) Reading package lists... Done Building dependency tree Reading state information... Done 64 packages can be upgraded. Run 'apt list --upgradable' to see them.
如您所见,
apt
确实获取了价值 16.1 MiB 的数据。第二次运行:
Hit:1 http://security.debian.org/debian-security buster/updates InRelease Hit:2 http://deb.debian.org/debian buster InRelease Hit:3 http://deb.debian.org/debian buster-updates InRelease Hit:4 http://deb.debian.org/debian sid InRelease Reading package lists... Done Building dependency tree Reading state information... Done 64 packages can be upgraded. Run 'apt list --upgradable' to see them.
如您所见,没有获取任何数据。
这里的“诀窍”是,当apt
向存档服务器发出 HTTP[S] 请求时,它会在其中包含已缓存的每个资源的“上次修改”时间;服务器会查看该时间戳,如果没有更新的资源版本,它会以特殊的 HTTP 状态代码(“未修改”)进行响应,并且不包含任何正文。服务器注意到apt
这一点并立即使用已经可用的内容。
如你所见,仍然存在一些流量(传出请求和传入响应),但:
- 与获取数据时相比,这微不足道。
- 如果不进行检查,您根本无法确定档案中没有更新的数据。