如何让 wget 重命名下载的文件以不包含查询字符串?

Kei*_*ley 38 wget podcasts http rename

我正在使用 wget 下载一个站点,并且很多链接都附加了查询,所以当我这样做时:

wget -nv -c -r -H -A mp3 -nd http://url.to.old.podcasts.com/
Run Code Online (Sandbox Code Playgroud)

我最终得到了很多这样的文件:

1.mp3?foo=bar
2.mp3?blatz=pow
3.mp3?fizz=buzz
Run Code Online (Sandbox Code Playgroud)

我想结束的是:

1.mp3
2.mp3
3.mp3
Run Code Online (Sandbox Code Playgroud)

这一切都发生在 ubuntu linux 中,我有 wget 1.10.2。

我知道在通过脚本重命名所有内容后,我可以做到这一点。但是,我真的很喜欢 wget 中的解决方案,这样我就可以在下载过程中看到正确的名称。

谁能帮我解开这个?

小智 26

如果服务器很友好,它可能会在下载文件上粘贴 Content-Disposition 标头,告知您的客户端正确的文件名。告诉 wget 收听最终文件名的标头非常简单:

wget --content-disposition
Run Code Online (Sandbox Code Playgroud)

您需要新版本的 wget 才能使用此功能。

我不知道它如何处理声称文件名为“/etc/passwd”的服务器。


小智 21

在处理了大批量之后,我意识到我应该指示wget忽略查询字符串。我不想再做一次,所以我制作了这个对我有用的脚本:

# /bin/bash
for i in `find $1 -type f`
do
    mv $i `echo $i | cut -d? -f1`
done
Run Code Online (Sandbox Code Playgroud)

把它放在一个像rmqstrchmod +x rmqstr 语法这样的文件中:./rmqstr <directory (defaults to .)>

它将递归地从所有文件名中删除查询字符串。

  • 我会添加` -name "*\?*"` 来查找部分以仅限于需要的文件:) (2认同)

qua*_*ote 5

我认为,为了wget保存为不同于 URL 指定的文件名,您需要使用-O filename参数。只有当你给它一个 URL 时,它才会做你想要的——如果有多个 URL,所有下载的内容最终都会以filename.

但这确实是答案。与其尝试在一个wget命令中完成所有操作,不如使用多个命令。现在您的工作流程变成:

  1. 运行wget以获取包含链接的基本 HTML 文件;
  2. 解析 URL;
  3. mp3, 结尾的 Foreach URL
    1. 处理 URL 以获取文件名(例如http://foo/bar/baz.mp3?gargle=blaster变成baz.mp3
    2. (可选)检查文件名不存在
    3. wget <URL> -O <filename>

这解决了您的问题,但现在您需要弄清楚如何获取基本文件以找到您的mp3URL。

你有一个特定的站点/基本 URL 吗?步骤 1 和 3 将通过具体示例更容易处理。