![在 wget 下载文件之前修改文件名称(不重命名本地版本)](https://linux22.com/image/1421531/%E5%9C%A8%20wget%20%E4%B8%8B%E8%BD%BD%E6%96%87%E4%BB%B6%E4%B9%8B%E5%89%8D%E4%BF%AE%E6%94%B9%E6%96%87%E4%BB%B6%E5%90%8D%E7%A7%B0%EF%BC%88%E4%B8%8D%E9%87%8D%E5%91%BD%E5%90%8D%E6%9C%AC%E5%9C%B0%E7%89%88%E6%9C%AC%EF%BC%89.png)
我有一个网站文件系统,其中每个文件都有两个副本,一个摘要副本和一个大副本,它们的名称不同。例如,一个大副本文件可能是 页面/信息/GK2grkG23r_lg.html而在摘要副本中,扩展名前的字母被更改为页面/信息/GK2grkG23r_sh.html。我试图在文件系统上运行 wget,但所有链接都设计为指向小副本以节省资源,而我需要大副本。因此在运行 wget 时页面可能会下载所有摘要副本:
pages/info/GK2grkG23r_sh.html
pages/info/2Yp58xr4Ir_sh.html
pages/info/Lmk2nIj23r_sh.html
pages/info/M23Dka6D4r_sh.html
我想将 wget 要下载的文件的名称更改为:
pages/info/GK2grkG23r_lg.html
pages/info/2Yp58xr4Ir_lg.html
pages/info/Lmk2nIj23r_lg.html
pages/info/M23Dka6D4r_lg.html
即使 wget 找到的文件也指向第一组。
需要说明的是,我不想下载上面第一组名称的文件,然后重命名它们。我想运行 wget,它会尝试下载第一个文件列表,但会稍微更改字母,以便下载第二个列表。wget 可以做到这一点吗?
答案1
您可以尝试一种解决方法。
这些里程碑包括:
- 下载完整文件列表并将其存储在文件中
- 更改文件名的最后部分
- 仅下载名称已修改的文件。
filter.awk
你需要一个类似这样的文件
/^--.*-- http:\/\/.*[^\/]$/ { u=$3; }
/^Length: [[:digit:]]+/ { print u; }
一步步:
wget -r -np --spider http://yourhost | awk -f filter.awk > My_List.txt
sed -i s/_sh.html/_lg.html/g My_List.txt
wget -x -i My_List.txt
致谢:
我的灵感来自这个答案。
答案2
首先,获取索引文件:
wget -O index.html "$URI"
然后,重写其中的 URL:
sed -i '/_sh\(\.html\)/_lg\1/g' index.html
(我使用了 sed,但您可能更喜欢基于 XSLT 的方法。请随意选择。)
现在,告诉 wget 抓取所有内容pages/info/*
,使用修改后的索引文件并将其原始位置作为起始基础 URI:
wget --recursive --level=1 \
--input-file=index.html --force-html --base="$URI" \
--accept-regex 'pages/info/.*_lg\.html'
注意:大多数长选项都有短选项 - 请参阅手册页。为了清晰起见,我使用了长格式。