tar:通过管道输入时使用“--one-top-level”

Pet*_*oll 4 bash tar

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

\n\n
wget -O - https://ufal.mff.cuni.cz/~zabokrtsky/courses/npfl104/data/classification/artificial_objects.tgz | tar -xvz --one-top-level\n
Run Code Online (Sandbox Code Playgroud)\n\n

结果(非常神秘的失败):

\n\n
...\nSaving to: \xe2\x80\x98STDOUT\xe2\x80\x99\n...\nCannot write to \xe2\x80\x98-\xe2\x80\x99 (Success).\n
Run Code Online (Sandbox Code Playgroud)\n\n

不指定--one-top-level可以解决问题,但随后内部的文件将按预期提取到当前文件夹。

\n\n

用两个单独的命令执行此操作:首先下载它,然后用中间文件解压,再次按预期进行。

\n\n
...\nSaving to: \xe2\x80\x98STDOUT\xe2\x80\x99\n...\nCannot write to \xe2\x80\x98-\xe2\x80\x99 (Success).\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n

TAR v2016

\n

Kam*_*ski 6

\n

最好与存档名称相同

\n
\n\n

man 1 tar说的是真的

\n\n
\n

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

\n
\n\n

问题是tar你的管道无法知道存档的名称;只wget知道它。该消息Cannot write to \xe2\x80\x98-\xe2\x80\x99 (Success)对我来说很神秘,就好像该工具感到困惑一样。在我的测试中,退出状态是2,这与所谓的“成功”相矛盾。也许tar在处理这种情况时应该改进。

\n\n

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

\n\n
wget -O - https://ufal.mff.cuni.cz/~zabokrtsky/courses/npfl104/data/classification/artificial_objects.tgz \\\n| tar -xvz --one-top-level=artificial_objects\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n
\n\n

基于

\n\n
$ tar --version\ntar (GNU tar) 1.29\n\xe2\x80\xa6\n
Run Code Online (Sandbox Code Playgroud)\n