首先检查本地文件是否存在且大小是否与远程文件一致,以此判断文件是否已经下载完整。如果没有下载完整,则进行断点续传继续下载。同时,脚本保留了文件完整性校验功能:
bash
#!/bin/bash
# FTP服务器配置
FTP_HOST="your_ftp_host"
FTP_USER="your_username"
FTP_PASS="your_password"
FTP_REMOTE_FILE="remote_path/to/file.ext"
LOCAL_FILE="local_path/to/save/file.ext"
# 断点续传相关
TMP_FILE="$LOCAL_FILE.part"
RESUME_POS=0
# 文件完整性校验相关
CHECKSUM_ALGO="md5sum" # 或者使用 sha1sum、sha256sum 等
REMOTE_CHECKSUM=$(ftp_cmd 'md5sum "$FTP_REMOTE_FILE"' | awk '{print $1}')
LOCAL_CHECKSUM=
function ftp_cmd() {
local cmd=$1
lftp -u "$FTP_USER,$FTP_PASS" -e "$cmd bye" sftp://$FTP_HOST
}
function is_file_downloaded() {
if [ ! -f "$LOCAL_FILE" ]; then
return 1
fi
REMOTE_SIZE=$(ftp_cmd 'du -b "$FTP_REMOTE_FILE"' | awk '{print $1}')
LOCAL_SIZE=$(stat -c "%s" "$LOCAL_FILE")
[ "$REMOTE_SIZE" -eq "$LOCAL_SIZE" ]
}
function download_file() {
if [ -s "$TMP_FILE" ]; then
RESUME_POS=$(stat -c "%s" "$TMP_FILE")
fi
wget --continue -O "$TMP_FILE" "ftp://$FTP_USER:$FTP_PASS@$FTP_HOST/$FTP_REMOTE_FILE"
mv "$TMP_FILE" "$LOCAL_FILE"
}
function check_integrity() {
LOCAL_CHECKSUM=$(eval "$CHECKSUM_ALGO $LOCAL_FILE")
if [ "$LOCAL_CHECKSUM" != "$REMOTE_CHECKSUM" ]; then
echo "File integrity check failed!"
exit 1
else
echo "File downloaded and verified successfully."
fi
}
if ! is_file_downloaded; then
download_file
fi
check_integrity
-
添加了一个名为
is_file_downloaded
的新函数,该函数检查本地文件是否存在且大小是否与远程文件相同。如果存在且大小相等,返回真(即退出状态码为0),否则返回假(退出状态码非0)。 -
在主流程中,首先调用
is_file_downloaded
函数判断文件是否已经完整下载。若未完整下载(即is_file_downloaded
返回假),则调用download_file
函数进行断点续传下载;否则,跳过下载步骤。 -
最后,无论文件是否重新下载,均执行
check_integrity
函数进行文件完整性校验,确保下载后的文件与远程文件内容一致。
请确保替换脚本中的FTP服务器配置信息为您实际的主机名、用户名、密码以及文件路径。此脚本依然使用wget
进行断点续传下载,并通过md5sum
进行文件完整性校验。如果您希望使用其他工具或方法,可以根据实际情况对脚本进行相应调整。