我正在使用 wget 下载一个网站,其中很多链接都附有查询,因此当我执行此操作时:
wget -nv -c -r -H -A mp3 -nd http://url.to.old.podcasts.com/
我最终得到了很多这样的文件:
1.mp3?foo=bar
2.mp3?blatz=pow
3.mp3?fizz=buzz
我希望的结果是:
1.mp3
2.mp3
3.mp3
这一切都发生在 ubuntu linux 中,我得到了 wget 1.10.2。
我知道我可以通过脚本获取所有内容后重命名所有内容。但是我真的很想在 wget 内部找到解决方案,这样我就可以在下载过程中看到正确的名称。
有人能帮我解开这个吗?
答案1
如果服务器态度好,它可能会将 Content-Disposition 标头粘贴到下载中,告知客户端正确的文件名。告诉 wget 监听该标头以获取最终文件名非常简单:
wget --content-disposition
您需要较新版本的 wget 才能使用此功能。
我不知道它如何处理声称文件名为“/etc/passwd”的服务器。
答案2
在处理完一大批数据后,我意识到我应该指示wget
忽略查询字符串。我不想再重复一遍,所以我制作了这个对我有用的脚本:
# /bin/bash
for i in `find $1 -type f`
do
mv $i `echo $i | cut -d? -f1`
done
rmqstr
将其放入类似以下的文件中chmod +x rmqstr
:语法:./rmqstr <directory (defaults to .)>
它将递归地从所有文件名中删除查询字符串。
答案3
我认为,为了wget
保存为与 URL 指定的文件名不同的文件名,您需要使用参数-O filename
。只有当您为其指定一个 URL 时,它才会执行您想要的操作 - 如果有多个 URL,则所有下载的内容最终都会以 结尾filename
。
但这确实是答案。不要尝试用一个命令完成所有操作wget
,而是使用多个命令。现在您的工作流程变成了:
- 运行
wget
以获取包含链接的基本 HTML 文件; - 解析 URL;
mp3
Foreach URL 以, 结尾- 处理 URL 以获取文件名(例如
http://foo/bar/baz.mp3?gargle=blaster
变成baz.mp3
- (可选)检查文件名是否存在
- 跑步
wget <URL> -O <filename>
- 处理 URL 以获取文件名(例如
这解决了您的问题,但是现在您需要弄清楚如何获取基础文件来找到您的mp3
URL。
您是否已考虑好特定网站/基本 URL?通过具体示例,步骤 1 和 3 将更容易处理。
答案4
为了正确地重命名文件,您必须考虑文件名中的空格,这是一种可能性,并且会弄乱 for 循环。
这是一个改进的版本:
find . -type f -name "*\?*" -print0 |
while IFS= read -r -d '' file;
do
mv -f "$file" "`echo $file | cut -d? -f1`";
done
这确保了带有空格的文件能够被循环(使用 \0 作为分隔符)和 mv 命令(双引号)正确处理
仅有几个复杂的情况下它不起作用,但除此之外,这是最好的选择。