我经常使用 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*