方法一:使用开源命令行工具 BaiduPCS-Go (最推荐)

这是目前在 Linux/Windows 服务器上最流行的第三方工具,它模拟了百度网盘的客户端,支持多线程下载,速度非常快。

  1. 下载工具:
# 示例:下载适合 Linux 64位的版本(请检查最新版本号)
wget https://github.com/qjfoidnh/BaiduPCS-Go/releases/download/v3.9.5/BaiduPCS-Go-v3.9.5-linux-amd64.zip
unzip BaiduPCS-Go-v3.9.5-linux-amd64.zip
cd BaiduPCS-Go-v3.9.5-linux-amd64
chmod +x BaiduPCS-Go
  1. 登录账号:
    运行程序:
    ./BaiduPCS-Go
    
    进入交互界面后,使用 login 命令。由于服务器通常没有浏览器,推荐使用 BDUSS 登录(Cookie登录)。
    • 如何获取 BDUSS?

方法一:使用快捷键(F12)
在本地浏览器登录百度网盘,按 F12 打开开发者工具 -> Application (或 Storage) -> Cookies -> 找到 BDUSS 的值并复制。

方法二:使用浏览器地址栏代码(最快捷,无需 F12)

这种方法通过在地址栏输入一段 JavaScript 代码来直接弹出 BDUSS,适用于大多数电脑浏览器。

  1. 在浏览器中打开 百度首页 (baidu.com) 并确保已经登录账号。

  2. 在浏览器的地址栏中,手动输入 javascript: (注意:直接复制粘贴整段代码时,浏览器为了安全通常会自动删掉开头的 javascript:,所以必须手动打这几个字)。

  3. 紧接着粘贴以下代码:

    alert(document.cookie.match(/BDUSS=(.*?)(;|$)/)[1])
    
  4. 按回车键。

  5. 浏览器会弹出一个窗口,里面的一长串字符就是你的 BDUSS

    • 在服务器输入:login -bduss=<你的BDUSS>

在这里插入图片描述
3. 下载文件:
登录成功后,使用类似 Linux 的命令操作:
* ls:列出文件
* cd:切换目录
* d <文件名>:下载文件 (例如 d movie.mp4)

优点: 免费、开源、支持多线程、无需图形界面。
缺点: 百度有时会针对非官方客户端限速(账号可能被暂时拉黑导致速度变慢,需要会员解封)。

实例:下载网盘数据

cd /geogfs1/home/wanzhougeo/Packages/BaiduPCS-Go-v3.9.5-linux-amd64/

# 确保先进入正确的下载目录
./BaiduPCS-Go config set -savedir /geogfs1/groups/scl/Data/

# 设置最大并发下载任务数为 50 (根据服务器性能可适当调整,一般 50-100 都可以)
./BaiduPCS-Go config set -max_parallel 50

# 设置下载缓存大小为 256KB (有助于减少磁盘碎片)
./BaiduPCS-Go config set -cache_size 262144

案例1:下载数据

# 下载地温数据
./run_downloadLST.sh
nohup ./run_downloadLST.sh > downloadLST.log 2>&1 &

# 下载气温数据
nohup ./run_downloadTa.sh &
nohup ./run_downloadTa.sh > downloadTa.log 2>&1 &

nohup ./run_downloadCode.sh > downloadB0.log 2>&1 &

用以下命令在 Linux 或 macOS 终端中查看该文件夹的大小:

du -sh /geogfs1/groups/scl/Data/2860562008_ww_for/

裁剪文件:

mv /geogfs1/groups/scl/Data/2860562008_ww_for/Africa_Ta_SVCMsp_2021TMIN_*.tif /geogfs1/groups/scl/Data/2860562008_ww_for/Africa2021/

mv /geogfs1/groups/scl/Data/2860562008_ww_for/Australia_Ta_SVCMsp_2021TMAX_*.tif /geogfs1/groups/scl/Data/2860562008_ww_for/Australia2021/

mv /geogfs1/groups/scl/Data/2860562008_ww_for/Australia_Ta_SVCMsp_2021TMIN_*.tif /geogfs1/groups/scl/Data/2860562008_ww_for/Australia2021/
mv /geogfs1/groups/scl/Data/2860562008_ww_for/ /geogfs1/groups/scl/Data/Global_Ta/

案例2:下载数据

实例:上传服务器数据至百度网盘(失败,BaiduPCS-Go被禁用)

cd /geogfs1/home/wanzhougeo/Packages/BaiduPCS-Go-v3.9.5-linux-amd64/

# 下载气温数据
nohup ./run_uploadTa.sh &

run_uploadTa.sh 脚本完整内容如下:

#!/bin/bash

# ================= 配置区域 =================
PCS_CMD="./BaiduPCS-Go"
LOCAL_ROOT="/geogfs1/groups/scl/Data/Global_Ta"
REMOTE_ROOT="/Ta"
LOG_DIR="./upload_logs"
CONTINENTS=("EuropeanAsia")
START_YEAR=2021
END_YEAR=2024
# ===========================================

echo "=========================================="
echo "=== Start Robust Upload Ta (${START_YEAR} -> ${END_YEAR}) ==="
echo "=========================================="
date

mkdir -p "$LOG_DIR"
$PCS_CMD mkdir "$REMOTE_ROOT" > /dev/null 2>&1

for year in $(seq ${START_YEAR} ${END_YEAR}); do
    for continent in "${CONTINENTS[@]}"; do
        
        FOLDER_NAME="${continent}${year}"
        LOCAL_FOLDER="${LOCAL_ROOT}/${FOLDER_NAME}"
        LOG_FILE="${LOG_DIR}/${FOLDER_NAME}_upload.log"
        
        echo "----------------------------------------" | tee -a "$LOG_FILE"
        echo "Processing Folder: ${FOLDER_NAME}" | tee -a "$LOG_FILE"
        
        if [ ! -d "$LOCAL_FOLDER" ]; then
            echo "[$(date +'%H:%M:%S')] SKIP: Local folder ${LOCAL_FOLDER} does not exist." | tee -a "$LOG_FILE"
            continue
        fi
        
        # 1. 在网盘创建对应的目标文件夹
        REMOTE_FOLDER="${REMOTE_ROOT}/${FOLDER_NAME}"
        $PCS_CMD mkdir "$REMOTE_FOLDER" >> "$LOG_FILE" 2>&1
        
        # 2. 核心修改:遍历本地文件夹中的 tif 文件,逐个上传
        # 这样彻底避免了 BaiduPCS-Go 内部并发获取列表导致的 31023 错误
        echo "[$(date +'%H:%M:%S')] Start uploading files one by one to ${REMOTE_FOLDER} ..." | tee -a "$LOG_FILE"
        
        # 统计文件总数用于显示进度
        TOTAL_FILES=$(ls -1 "$LOCAL_FOLDER"/*.tif 2>/dev/null | wc -l)
        CURRENT_FILE=0
        
        for file in "$LOCAL_FOLDER"/*.tif; do
            # 如果没有匹配到文件,跳过
            [ -e "$file" ] || continue 
            
            ((CURRENT_FILE++))
            FILENAME=$(basename "$file")
            echo "[$(date +'%H:%M:%S')] ($CURRENT_FILE/$TOTAL_FILES) Uploading: $FILENAME" | tee -a "$LOG_FILE"
            
            # 逐个文件上传到指定的远端目录
            $PCS_CMD upload "$file" "$REMOTE_FOLDER" >> "$LOG_FILE" 2>&1
        done
        
        echo "[$(date +'%H:%M:%S')] FINISHED: Folder ${FOLDER_NAME} processed." | tee -a "$LOG_FILE"
        
    done
done

echo "========================================"
echo "=== All Ta data has been uploaded ==="
echo "========================================"
date

设置 最大并发上传数 如下:

./BaiduPCS-Go config set -max_upload_parallel 5

(将最大并发上传数设置为 2 或 1,虽然上传速度会稍微变慢,但会极其稳定,不再报错)

单个文件测试上传

测试单个文件的上传:

./BaiduPCS-Go upload /geogfs1/groups/scl/Data/Global_Ta/EuropeanAsia2021/EuropeanAsia_Ta_SVCMsp_2021TMAX_001.tif /Ta/EuropeanAsia2021/

如果单文件测试依然报 31023 错误,请按以下步骤修复:
在这里插入图片描述
第一步:验证是否全局 API 都失效了

请在终端直接运行查看文件列表的命令:

./BaiduPCS-Go ls

如果这个命令也报错 31023,说明确实是全局的 API 通信问题。

方法一:修改 AppID(最常见的有效解决方法)
很多时候是因为默认的 AppID 接口被百度限制了。可以尝试修改为一个官方常用的 AppID(例如 266719 或 265486)。

依次执行以下命令:

# 将 AppID 修改为常用的 266719 (或者尝试 778750)
./BaiduPCS-Go config set -appid=266719
./BaiduPCS-Go config set -appid=778750

# 再次尝试列出网盘目录,看看是否恢复正常
./BaiduPCS-Go ls
# 退出当前账号并重新登录(修改 AppID 后通常需要重新登录才能生效)
./BaiduPCS-Go logout
./BaiduPCS-Go login
./BaiduPCS-Go login -bduss=这里替换成你刚刚复制的BDUSS字符串

第四步:再次测试单文件上传
当 ./BaiduPCS-Go ls 能够正常打印出网盘里的文件列表,不再报错时,请再次运行之前的测试命令:

./BaiduPCS-Go upload /geogfs1/groups/scl/Data/Global_Ta/EuropeanAsia2021/EuropeanAsia_Ta_SVCMsp_2021TMAX_001.tif /Ta/EuropeanAsia2021

方法二:使用官方授权的 bypy

与 BaiduPCS-Go 的“破解/模拟”路线不同,bypy 走的是百度官方的开发者 API 接口,因此极其稳定,几乎永远不会报 31023 这种风控错误

  1. 安装 bypy(HPC 通常都自带 Python 环境):

    pip install bypy
    

    (如果提示权限不足,可以加 --userpip install bypy --user)
    在这里插入图片描述

  2. 进行官方授权登录
    在终端输入:

    bypy info
    

    终端会输出一个链接。复制这个链接,在您登录了百度网盘的电脑浏览器里打开。
    网页会显示一串授权码。将这串授权码复制,粘贴回 Linux 终端并回车。就登录成功了!

  3. 使用限制与方法(重要)
    因为走的是官方接口,为了安全,百度限制 bypy 只能访问网盘里的一个特定文件夹,路径是:
    我的网盘 / 我的应用数据 / bypy (或者 apps/bypy)

    • 下载文件:需要先在电脑或手机上,把想下载的数据移动到网盘的 我的应用数据/bypy 文件夹里。然后在终端运行:
      bypy down 文件名
      
    • 上传文件:在终端运行:
      bypy upload 本地文件名
      
      文件会被上传到网盘的 我的应用数据/bypy 目录下。
# 下载气温数据
nohup ./run_uploadTa.sh &

run_uploadTa.sh 脚本内容如下:

#!/bin/bash

# ================= 配置区域 =================
# 将原来的 BaiduPCS-Go 替换为 bypy
BYPY_CMD="bypy"
LOCAL_ROOT="/geogfs1/groups/scl/Data/Global_Ta"

REMOTE_ROOT="Ta"
LOG_DIR="./upload_logs"
CONTINENTS=("EuropeanAsia")
START_YEAR=2021
END_YEAR=2022
# ===========================================

echo "=========================================="
echo "=== Start Robust Upload Ta (${START_YEAR} -> ${END_YEAR}) ==="
echo "=========================================="
date

mkdir -p "$LOG_DIR"
# 使用 bypy 创建远端根目录
$BYPY_CMD mkdir "$REMOTE_ROOT" > /dev/null 2>&1

for year in $(seq ${START_YEAR} ${END_YEAR}); do
    for continent in "${CONTINENTS[@]}"; do
        
        FOLDER_NAME="${continent}${year}"
        LOCAL_FOLDER="${LOCAL_ROOT}/${FOLDER_NAME}"
        LOG_FILE="${LOG_DIR}/${FOLDER_NAME}_upload.log"
        
        echo "----------------------------------------" | tee -a "$LOG_FILE"
        echo "Processing Folder: ${FOLDER_NAME}" | tee -a "$LOG_FILE"
        
        if [ ! -d "$LOCAL_FOLDER" ]; then
            echo "[$(date +'%H:%M:%S')] SKIP: Local folder ${LOCAL_FOLDER} does not exist." | tee -a "$LOG_FILE"
            continue
        fi
        
        # 1. 在网盘创建对应的目标文件夹
        REMOTE_FOLDER="${REMOTE_ROOT}/${FOLDER_NAME}"
        $BYPY_CMD mkdir "$REMOTE_FOLDER" >> "$LOG_FILE" 2>&1
        
        # 2. 遍历本地文件夹中的 tif 文件,逐个上传
        echo "[$(date +'%H:%M:%S')] Start uploading files one by one to ${REMOTE_FOLDER} ..." | tee -a "$LOG_FILE"
        
        # 统计文件总数用于显示进度
        TOTAL_FILES=$(ls -1 "$LOCAL_FOLDER"/*.tif 2>/dev/null | wc -l)
        CURRENT_FILE=0
        
        for file in "$LOCAL_FOLDER"/*.tif; do
            # 如果没有匹配到文件,跳过
            [ -e "$file" ] || continue 
            
            ((CURRENT_FILE++))
            FILENAME=$(basename "$file")
            echo "[$(date +'%H:%M:%S')] ($CURRENT_FILE/$TOTAL_FILES) Uploading: $FILENAME" | tee -a "$LOG_FILE"
            
            # 逐个文件上传到指定的远端目录
            # bypy upload <本地路径> <远端路径>
            $BYPY_CMD upload "$file" "$REMOTE_FOLDER" >> "$LOG_FILE" 2>&1
        done
        
        echo "[$(date +'%H:%M:%S')] FINISHED: Folder ${FOLDER_NAME} processed." | tee -a "$LOG_FILE"
        
    done
done

echo "========================================"
echo "=== All Ta data has been uploaded ==="
echo "========================================"
date

服务器中批量裁剪文件

cp /geogfs1/groups/scl/Data/Ta_SVCMsp_global_V2026/2_output/Ta2021/EuropeanAsia2021/ /geogfs1/groups/scl/Data/Global_Ta/EuropeanAsia2021/

/geogfs1/groups/scl/Data/Ta_SVCMsp_global_V2026/2_output/Ta2021/EuropeanAsia2021rep/
cd /geogfs1/groups/scl/Data/Ta_SVCMsp_global_V2026/2_output/
chmod +x copy_ta_data.sh

dos2unix copy_ta_data.sh
./copy_ta_data.sh 2022
./copy_ta_data.sh 2020 2021 2022

copy_ta_data.sh 脚本内容如下:

#!/bin/bash

# 检查是否提供了年份参数
if [ "$#" -eq 0 ]; then
    echo "使用方法: $0 <年份1> [年份2] [年份3] ..."
    echo "示例: $0 2021 2022 2023"
    exit 1
fi

# 遍历所有传入的年份参数
for YEAR in "$@"; do
    echo "========================================"
    echo "正在处理年份: ${YEAR} ..."
    
    # 定义对应年份的文件夹路径
    SRC_DIR="/geogfs1/groups/scl/Data/Ta_SVCMsp_global_V2026/2_output/Ta${YEAR}/EuropeanAsia${YEAR}"
    REP_DIR="/geogfs1/groups/scl/Data/Ta_SVCMsp_global_V2026/2_output/Ta${YEAR}/EuropeanAsia${YEAR}rep"
    TARGET_DIR="/geogfs1/groups/scl/Data/Global_Ta/EuropeanAsia${YEAR}"

    # 1. 创建目标文件夹(如果不存在的话,-p 参数会自动创建父目录且不会报错)
    mkdir -p "${TARGET_DIR}"
    echo "已确保目标文件夹存在: ${TARGET_DIR}"

    # 2. 拷贝原始数据
    if [ -d "${SRC_DIR}" ]; then
        echo "正在拷贝原始数据: ${SRC_DIR} -> ${TARGET_DIR}"
        # 拷贝所有 tif 文件。2>/dev/null 用于隐藏找不到文件时的系统报错,由后面的 echo 提供友好提示
        cp "${SRC_DIR}"/*.tif "${TARGET_DIR}/" 2>/dev/null || echo "  [警告] ${SRC_DIR} 中没有找到 .tif 文件。"
    else
        echo "  [错误] 原始数据文件夹不存在: ${SRC_DIR}"
    fi

    # 3. 拷贝替换数据 (使用 -f 强制覆盖同名文件)
    if [ -d "${REP_DIR}" ]; then
        echo "正在拷贝并替换数据: ${REP_DIR} -> ${TARGET_DIR}"
        cp -f "${REP_DIR}"/*.tif "${TARGET_DIR}/" 2>/dev/null || echo "  [提示] ${REP_DIR} 中没有找到需要替换的 .tif 文件。"
    else
        echo "  [提示] 替换文件夹不存在,跳过替换步骤: ${REP_DIR}"
    fi

    echo "年份 ${YEAR} 处理完成!"
done

echo "========================================"
echo "所有指定年份的数据拷贝与替换任务已全部执行完毕!"

参考

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐