You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用wget仅在文件更新或大小变化时重新下载?

解决wget -N参数失效,仅在文件更新/大小变化时重新下载的方案

-N参数的局限性很明确:它依赖服务器返回的Last-Modified和ETag响应头,通过对比本地文件的修改时间判断是否需要更新。如果服务器没返回这些头、本地系统时间不准,或者本地文件的修改时间被篡改,这个参数就会失效。

下面给两个实用的替代方案:

方案一:通过文件大小对比判断(通用脚本)

写个简单的bash脚本,先探测服务器上文件的大小,和本地文件对比,不一致就重新下载:

# 替换成你的目标文件URL和本地保存路径
TARGET_URL="http://your-domain.com/your-archive.tar.gz"
LOCAL_FILE="./your-archive.tar.gz"

# 获取服务器文件的Content-Length(大小)
REMOTE_FILE_SIZE=$(wget --spider --server-response "$TARGET_URL" 2>&1 | grep -i "Content-Length" | awk '{print $2}' | tr -d '\r\n')

# 获取本地文件大小(如果文件存在)
if [ -f "$LOCAL_FILE" ]; then
    LOCAL_FILE_SIZE=$(stat -c%s "$LOCAL_FILE")
else
    LOCAL_FILE_SIZE=0
fi

# 对比大小,不一致则下载
if [ "$REMOTE_FILE_SIZE" != "$LOCAL_FILE_SIZE" ]; then
    echo "文件大小变化,开始下载..."
    wget "$TARGET_URL" -O "$LOCAL_FILE"
else
    echo "文件未更新,无需下载"
fi

注意:如果服务器不返回Content-Length头,这个方法会失效,此时可以用下面的校验和方案。

方案二:通过校验和对比(更可靠)

如果服务器提供了文件的校验和(比如SHA256),或者你能提前拿到校验和,可以用wget的--checksum参数(wget 1.19+版本支持):

  1. 先获取服务器上文件的校验和(比如从官方页面复制,或者用curl下载校验和文件)
  2. 执行下载命令时指定校验和:
wget --checksum=sha256 --checksum-file=./archive.sha256 http://your-domain.com/your-archive.tar.gz

如果本地文件的校验和与指定的不一致,wget会自动重新下载。

如果服务器没有提供校验和文件,也可以先下载一次文件生成校验和,之后每次下载前对比远程文件的校验和:

TARGET_URL="http://your-domain.com/your-archive.tar.gz"
LOCAL_FILE="./your-archive.tar.gz"
CHECKSUM_FILE="./archive.sha256"

# 首次下载时生成校验和
if [ ! -f "$CHECKSUM_FILE" ]; then
    wget "$TARGET_URL" -O "$LOCAL_FILE"
    sha256sum "$LOCAL_FILE" > "$CHECKSUM_FILE"
fi

# 下载远程文件的临时副本,对比校验和
wget "$TARGET_URL" -O "$LOCAL_FILE.tmp"
if sha256sum --check "$CHECKSUM_FILE" --ignore-missing; then
    rm "$LOCAL_FILE.tmp"
    echo "文件未更新"
else
    mv "$LOCAL_FILE.tmp" "$LOCAL_FILE"
    sha256sum "$LOCAL_FILE" > "$CHECKSUM_FILE"
    echo "文件已更新,替换本地文件"
fi

内容的提问来源于stack exchange,提问作者user5994461

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 12:33:22