tar提取取决于文件名吗?


33

我经常使用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解压缩后效果完美。

有没有一种方法,在提取之前我不必每次都重新命名目标文件?

Answers:


50

您看到的错误原因可以在GNU tar文档中找到

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

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

相同的文档继续说:

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


请注意,--force-local必须在f... 之前添加它,当我初次尝试此操作时,它给我有关如何没有这样的文件的错误消息--force-local。也许这太“没意思了”,但是直到5分钟后我才意识到自己犯的错误。
ArtOfWarfare

@ArtOfWarfare:f接受一个参数,即tarfile。您不能--force-localf和变量之间插入参数,但这是所有程序的标准,而不仅仅是tarand -f。你可以把--force-localf,只要它也是参数后f
camh

就像我在评论中说的那样,也许这太“不了”。我像这样使用tar tar -cvzf ...,甚至不用考虑每个标志在99%的时间内真正做什么-这是我制作tar.gz的方式。
ArtOfWarfare

在此说明上,为了更有效地说明这两个(@ArtOfWarfare和@camh)在说什么,以下是一个示例: tar zxvf C:\Users\jdoe\Documents\tarfile.tgz --force-local
Dan Dan Dr

6

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

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

这将导致文件以给定的文件名保存,从而避免了麻烦或重命名。不,您并不是唯一希望sourcefourge不会笨拙地传递带有url参数的文件的人。


这不是SourceForge的错,而是wget的。使用该--content-disposition标志保存服务器指定的文件名(但要注意安全性,因为SourceForge可以随后写入任意文件名)。
pcworld

4

下载使用

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认为是一个远程文件。因此,我们需要强制执行它是本地的事实。

失败

$ tar czf "back$(date -u +"%H:%M").tar.gz" ./
tar (child): Cannot connect to back10: resolve failed
tar: Child returned status 128
tar: Error is not recoverable: exiting now

明确的事实是通过添加本地文件./(当前目录)和正确引用:

$ tar czf ./"back$(date -u +'%H:%M').tar.gz" ./
tar: .: file changed as we read it

该警告是由于我正在源目录中创建的事实。


比使用长标记好得多。我也相信远程主机下载是无用的选择,尽管有特定工具可以实现此目的。
Alireza Mohamadi

3

对于已经下载的文件,这应该起作用:

tar xzf - < SQliteManager-1.2.4.tar.gz*
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.