如何用wget脚本仅下载10天前上传的NASA TROPOMI数据?
搞定你的NASA TROPOMI数据下载脚本!
咱们先聊聊你的脚本为啥会把2020年所有数据都下下来——核心是两个小错误搞砸了逻辑:
问题出在哪?
- 函数调用写错了:你在wget的URL里写的
$DATE的内容完全不对,正确的函数调用应该用$(DATE)或者反引号`DATE`,不然wget会把URL当成https://.../2020/,直接递归下载整个2020年的目录! - 日期逻辑不完整:你只取了儒略日(一年中的第几天),但没考虑年份——万一10天前已经跨年了呢?而且这个逻辑其实是在找10天前日期对应的目录,不是“10天前上传”的文件(不过如果NASA的目录是按文件生成日期存的,这俩可能一致)。
修正后的脚本(精准下载10天前日期对应的目录文件)
如果你的需求是下载10天前的日期对应的NASA目录下的.nc文件(毕竟TROPOMI的目录结构是年份/儒略日),用这个脚本就行:
#!/bin/bash # 定义函数:获取10天前的年份+儒略日,格式比如2024/123 get_target_dir() { date -d 'now - 10 days' +"%Y/%j" } # 拼接完整的目标URL BASE_URL="https://tropomi.gesdisc.eosdis.nasa.gov/data/S5P_TROPOMI_Level2/S5P_L2__NO2____HiR.1/" TARGET_DIR=$(get_target_dir) FULL_URL="${BASE_URL}${TARGET_DIR}" # 执行下载,参数保持你的配置 wget -o downloadNew.log \ --user=xxxx --password=yyyy \ -r -c -nH -nd -np -N -A '*.nc' \ --content-disposition \ "${FULL_URL}"
关键修正点
- 正确调用函数:用
$(get_target_dir)执行函数并拿到返回值,确保URL精准指向10天前的目录,不会瞎逛整个年份目录。 - 完整路径拼接:同时获取年份和儒略日,哪怕10天前是去年,也能定位到正确的文件夹。
- 限制下载范围:
-np参数确保wget不会往上爬父目录,只下载目标目录里的.nc文件。
如果真要“只下载10天前上传的文件”
如果你的需求是不管文件在哪个目录,只挑服务器上10天前上传的.nc,那得换个思路——wget本身没法直接筛选上传时间,得先拿到目录里的文件列表,再对比时间:
#!/bin/bash # 计算10天前的Unix时间戳 TEN_DAYS_AGO=$(date -d 'now - 10 days' +%s) BASE_URL="https://tropomi.gesdisc.eosdis.nasa.gov/data/S5P_TROPOMI_Level2/S5P_L2__NO2____HiR.1/" # 先爬取所有.nc文件的URL,再筛选最后修改时间符合条件的 wget -q --user=xxxx --password=yyyy -r -l inf --spider -nd -np -A '*.nc' "${BASE_URL}" 2>&1 | grep '^--' | awk '{print $3}' | while read FILE_URL; do # 获取文件的最后修改时间戳 FILE_TIMESTAMP=$(wget --user=xxxx --password=yyyy --spider --server-response "${FILE_URL}" 2>&1 | grep 'Last-Modified' | awk '{print $4,$5,$3,$7}' | xargs -I {} date -d {} +%s) # 对比时间,只下载10天前的 if [ "$FILE_TIMESTAMP" -ge "$TEN_DAYS_AGO" ]; then wget -o downloadNew.log -c --user=xxxx --password=yyyy --content-disposition "${FILE_URL}" fi done
注意:这个方法会慢一点,因为要逐个检查文件的修改时间,而且得确保NASA服务器返回
Last-Modified头信息。
先验证再执行!
运行脚本前,先echo一下${FULL_URL}(第一个脚本里的变量),确认URL是正确的10天前目录,避免又下错一堆数据~
内容的提问来源于stack exchange,提问作者Muhammad Irsa
相关产品推荐
相关产品推荐

