tar 提取取决于文件名?

tar 提取取决于文件名?

我经常使用 wget 从 sourceforge.net 下载 tarball。

然后对下载的文件进行命名,例如SQliteManager-1.2.4.tar.gz?r=http:%2F%2Fsourceforge.net%2Fprojects%2Fsqlitemanager%2Ffiles%2F&ts=1305711521&use_mirror=switch

当我尝试

tar xzf SQliteManager-1.2.4.tar.gz\?r\=http\:%2F%2Fsourceforge.net%2Fprojects%2Fsqlitemanager%2Ffiles%2F\&ts\=1305711521\&use_mirror\=switch

我收到以下错误消息:

tar (child): Cannot connect to SQliteManager-1.2.4.tar.gz?r=http: resolve failed

gzip: stdin: unexpected end of file
tar: Child returned status 128
tar: Error is not recoverable: exiting now

将文件重命名后,foo.tar.gz解压效果完美。

有没有办法,让我不必每次提取之前都重命名目标文件?

答案1

您所看到的错误的原因可以在GNU tar 文档:

如果存档文件名包含冒号(':'),则假定它是另一台计算机上的文件[...]

也就是说,它解释SQliteManager-1.2.4.tar.gz?r=http为主机名并尝试将其解析为 IP 地址,因此出现“解析失败”错误。

同一份文件接着说:

如果您需要使用名称中包含冒号的文件,则可以使用“--force-local”选项来禁止远程磁带驱动器行为。

答案2

使用 下载时wget,请使用 选项指定输出文件名-O

wget "http://domain.com/file.tgz?crazy=args&stuff=todelete" -O file.tgz

这将导致文件以给定的文件名保存,并为您省去重命名的麻烦。不,您并不是唯一一个希望 sourcefourge 不会愚蠢到传递带有附加 url 参数的文件的人。

答案3

下载使用

wget --trust-server-names URL

这样 wget 将以正确的文件名保存。默认情况下,它使用 URL 中的最后一个组件

例如

wget --trust-server-names http://sourceforge.net/projects/sqlitemanager/files/sqlitemanager/1.2.4/SQliteManager-1.2.4.tar.gz/download

答案4

对于已经下载的文件,这应该有效:

tar xzf - < SQliteManager-1.2.4.tar.gz*

相关内容