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

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

我正在使用 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,而是使用多个命令。现在您的工作流程变成了:

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

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

您是否已考虑好特定网站/基本 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 命令(双引号)正确处理

仅有几个复杂的情况下它不起作用,但除此之外,这是最好的选择。

相关内容