如何使用curl或wget下载文件时按来源URL重命名保存文件?
curl/wget 批量下载链接按来源URL命名方案
curl 和 wget 都可以实现该需求,具体操作如下:
curl 实现方式
curl 没有直接将完整URL转换为平级唯一文件名的单参数,可根据需求选以下两种方案:
- 平级文件方案(兼容所有curl版本,命名规则可自定义)
先给链接列表里所有地址补上http://或https://协议头,存为urls.txt,每行一个链接,执行以下命令即可:
执行后while read -r url; do # 将URL里的冒号、斜杠替换为下划线作为文件名,可自行修改sed规则调整命名格式 save_name=$(echo "$url" | sed 's#[:/]#_#g') curl -fLo "$save_name" "$url" done < urls.txtsite1.com/1.txt会保存为https_site1.com_1.txt,site2.com/1.txt会保存为https_site2.com_1.txt,无重名覆盖问题,文件名直接对应来源URL。 - 目录结构方案(curl 7.73.0+版本支持)
不介意生成对应层级目录的话,可以直接用参数实现,不用手写循环:
命令会自动创建对应域名的文件夹,把不同站点的1.txt存在对应域名目录下,不会覆盖。sed 's#^#https://#' urls.txt | xargs curl -fLO --create-dirs
wget 实现方式
wget 原生对该场景支持更好,操作更简便:
- 目录结构保存(最省事,零额外逻辑)
先给链接补上协议头,执行以下命令:# 临时生成带协议头的链接列表 sed 's#^#https://#' urls.txt > urls_with_proto.txt wget -x -i urls_with_proto.txt-x参数会强制按照远程URL的主机名、路径创建本地目录,最终site1.com文件夹下存该站点的1.txt,site2.com文件夹下存对应站点的1.txt,和来源完全匹配,无重名问题。 - 平级文件保存(所有文件存同一目录,文件名带来源标识)
不想生成多层目录的话,用简单循环处理即可,逻辑和curl方案一致:while read -r origin_url; do full_url="https://$origin_url" save_name=$(echo "$full_url" | sed 's#[:/]#_#g') wget -O "$save_name" "$full_url" done < urls.txt
注意:由于你要下载的是频繁更新的文件,可以给curl加
-z参数、给wget加-N参数,开启时间戳校验,仅下载内容有更新的文件,减少无效重复请求。
内容的提问来源于stack exchange,提问作者danloael
相关产品推荐
相关产品推荐

