因为服务器太多,每次一个一个改文件很麻烦于是就有了这个定时从链接下载文件的脚本。

  1. 保存脚本
    将下面的内容保存到一个文件,例如batch_monthly_downloader.sh。建议将其保存在 /opt/scripts/ 目录下。
#!/bin/bash
# --- 配置项 (请根据您的需求修改以下变量) ---

# 包含所有要下载文件URL的列表文件路径
# 每行一个URL。空行和以'#'开头的行会被忽略。
URLS_LIST_FILE="/opt/scripts/monthly_download_urls.txt"

# 本地保存文件的目录
# 确保该目录存在,且脚本运行用户有写入权限。
TARGET_DIR="/path/to/your/monthly_batch_files"

# 日志文件路径
# 用于记录每次脚本运行的结果。
LOG_FILE="/var/log/batch_monthly_download.log"

# --- 脚本内部变量 (通常无需修改) ---
SCRIPT_NAME=$(basename "$0")
TIMESTAMP=$(date "+%Y-%m-%d %H:%M:%S")

# --- 函数定义 ---

# 记录日志函数
log_message() {
    echo "${TIMESTAMP} [${SCRIPT_NAME}] $1" | tee -a "${LOG_FILE}"
}

# --- 脚本主体 ---

log_message "INFO: 脚本开始运行。"
log_message "INFO: URL列表文件: ${URLS_LIST_FILE}"
log_message "INFO: 保存目录: ${TARGET_DIR}"

# 检查wget是否安装
if ! command -v wget &> /dev/null; then
    log_message "ERROR: 'wget' 未安装。请执行 'sudo apt update && sudo apt install wget' 安装。"
    exit 1
fi

# 确保目标目录存在
if [ ! -d "${TARGET_DIR}" ]; then
    log_message "INFO: 目标目录 '${TARGET_DIR}' 不存在,正在创建..."
    mkdir -p "${TARGET_DIR}"
    if [ $? -ne 0 ]; then
        log_message "ERROR: 无法创建目标目录 '${TARGET_DIR}'。请检查权限。"
        exit 1
    fi
fi

# 检查URL列表文件是否存在
if [ ! -f "${URLS_LIST_FILE}" ]; then
    log_message "ERROR: URL列表文件 '${URLS_LIST_FILE}' 不存在。请创建该文件并填充URL。"
    exit 1
fi

log_message "INFO: 正在处理URL列表中的文件..."

# 逐行读取URL列表文件
# IFS= 设置内部字段分隔符为空格,read -r 禁用反斜杠转义
# $(echo "$source_url" | xargs) 用于去除行首行尾的空白字符
while IFS= read -r source_url || [[ -n "$source_url" ]]; do
    source_url=$(echo "$source_url" | xargs) # 去除前后空格

    # 跳过空行和以'#'开头的注释行
    if [[ -z "$source_url" || "$source_url" =~ ^# ]]; then
        continue
    fi

    # 从URL中提取文件名
    # 例如:https://example.com/path/to/report_Q1_2024.pdf 会提取出 report_Q1_2024.pdf
    TARGET_FILENAME=$(basename "$source_url")
    DOWNLOAD_PATH="${TARGET_DIR}/${TARGET_FILENAME}"

    log_message "INFO: 正在下载 '${source_url}' 到 '${DOWNLOAD_PATH}'..."
    # -nv: 不显示详细的下载进度信息
    # -O: 指定输出文件路径,wget会自动覆盖同名文件
    wget -nv -O "${DOWNLOAD_PATH}" "${source_url}"

    # 检查wget命令的退出状态
    if [ $? -eq 0 ]; then
        log_message "SUCCESS: 文件 '${TARGET_FILENAME}' 下载成功。"
    else
        log_message "ERROR: 文件 '${source_url}' 下载失败。请检查URL或网络连接。"
    fi
done < "${URLS_LIST_FILE}" # 将文件内容重定向到while循环的输入

log_message "INFO: 所有文件处理完毕。脚本运行结束。"
exit 0
  1. 创建并配置 URL 列表文件
    创建一个文本文件,例如 monthly_download_urls.txt,在其中每行写入一个要下载的文件的完整 URL。把这个文件保存在脚本配置的 URLS_LIST_FILE 路径下,例如 /opt/scripts/monthly_download_urls.txt

  2. 配置脚本变量
    打开您刚刚保存的脚本文件 batch_monthly_downloader.sh,修改顶部的 配置项 部分:

URLS_LIST_FILE: 确保这是你刚刚创建的 monthly_download_urls.txt 文件的正确路径。
TARGET_DIR: 替换为你希望保存所有下载文件的本地目录,例如 /home/youruser/downloads/monthly_batch_files
LOG_FILE: 日志文件的路径,/var/log/batch_monthly_download.log 是一个常见的选择。

  1. 授予执行权限
    使脚本可执行:
sudo chmod +x /opt/scripts/batch_monthly_downloader.sh
  1. 设置 Cron 计划任务
    以您希望运行该脚本的用户身份执行(通常是您自己的用户,或创建一个专门的用户):
crontab -e

第一次使用Cron出现选择默认编辑器,我一般习惯使用vim

在输入编辑器的数字后将会打开一个文本编辑器。在文件末尾添加以下一行:

0 0 1 * * /opt/scripts/batch_monthly_downloader.sh >> /dev/null 2>&1

解释 Cron 表达式 0 0 1 * *:

0 0 1 * *: 表示每个月的第1天的午夜0点0分运行。
>> /dev/null 2>&1: 这部分将脚本的所有标准输出和标准错误重定向到 /dev/null,这意味着它不会发送邮件给用户。脚本内部已经配置了日志文件 (LOG_FILE) 来记录运行信息。
保存并退出 crontab -e