tar:当输入通过管道输入时使用 `--one-top-level`

tar:当输入通过管道输入时使用 `--one-top-level`

我正在尝试下载一个 tar(有效)并立即将其解压到子目录(最好与存档同名)。我认为以下代码应该可以工作,但它尝试将解压后的文件写入 STDOUT 并失败。

wget -O - https://ufal.mff.cuni.cz/~zabokrtsky/courses/npfl104/data/classification/artificial_objects.tgz | tar -xvz --one-top-level

导致(非常神秘的失败):

...
Saving to: ‘STDOUT’
...
Cannot write to ‘-’ (Success).

不指定--one-top-level可以解决问题,但里面的文件只会被提取到当前文件夹,正如预期的那样。

使用两个单独的命令执行此操作:先下载然后使用中间文件解压,同样符合预期。

wget https://ufal.mff.cuni.cz/~zabokrtsky/courses/npfl104/data/classification/artificial_objects.tgz
tar -xvz --one-top-level -f artificial_objects.tgz

我知道我可以创建一个子文件夹并使用 -C 更改 tar 的输出目录,但我更想知道为什么我的方法不起作用。

TAR v2016

答案1

最好与档案名称相同

这是真的man 1 tar

--one-top-level[=DIR]
将所有文件提取到 中DIR,或者,如果不使用参数,则提取到由档案基本名称命名的子目录中(减去 可识别的标准压缩后缀--auto-compress)。

问题tar在于你的管道无法知道档案的名称;只wget知道它。这条消息Cannot write to ‘-’ (Success)对我来说很神秘,好像工具搞混了。在我的测试中,退出状态是2,这与所谓的“成功”相矛盾。也许tar应该改进处理这种情况的方法。

无论如何,tar不​​知道档案的名称。如果您提供以下内容,它将起作用DIR

wget -O - https://ufal.mff.cuni.cz/~zabokrtsky/courses/npfl104/data/classification/artificial_objects.tgz \
| tar -xvz --one-top-level=artificial_objects

这可能是也可能不是artificial_objects,这完全取决于你。如果需要,该工具将创建目录。


基于

$ tar --version
tar (GNU tar) 1.29

相关内容