如何使用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+版本支持):
- 先获取服务器上文件的校验和(比如从官方页面复制,或者用curl下载校验和文件)
- 执行下载命令时指定校验和:
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
相关产品推荐
相关产品推荐

