从 wget 到 tar 的流管道

从 wget 到 tar 的流管道

我想下载 Linux 内核并一步解压它。有很多手册关于它。所以我尝试:

$ wget  https://cdn.kernel.org/pub/linux/kernel/v6.x/linux-6.3.1.tar.xz | tar -xav -C /home/a/myKernel/
--2023-05-06 03:04:38--  https://cdn.kernel.org/pub/linux/kernel/v6.x/linux-6.3.1.tar.xz
Resolving cdn.kernel.org (cdn.kernel.org)... 146.75.49.176, 2a04:4e42:7c::432
Connecting to cdn.kernel.org (cdn.kernel.org)|146.75.49.176|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 136934448 (131M) [application/x-xz]
Saving to: ‘linux-6.3.1.tar.xz’

linux-6.3.1.tar.xz                                          100%[========================================================================================================================================>] 130.59M  9.08MB/s    in 14s     

2023-05-06 03:04:52 (9.32 MB/s) - ‘linux-6.3.1.tar.xz’ saved [136934448/136934448]

tar: This does not look like a tar archive
tar: Exiting with failure status due to previous errors

我也尝试过:

$ aria2c https://cdn.kernel.org/pub/linux/kernel/v6.x/linux-6.3.1.tar.xz | tar -xz -C /home/a/myKernel/

gzip: stdin: not in gzip format
tar: Child returned status 1
tar: Error is not recoverable: exiting now

每次我都会遇到错误。但这两个命令工作正常:

$ wget  https://cdn.kernel.org/pub/linux/kernel/v6.x/linux-6.3.1.tar.xz
$ tar xavf linux-6.3.1.tar.xz

如何使用单个命令下载并解压 Linux 内核?

答案1

使用 GNU tar,tar xf file.tar.xz调用xz -d解压缩文件上的文件,但由于某种原因,这不适用于-.

切换到 libarchivebsdtar会起作用:

wget -qO- https://cdn.kernel.org/pub/linux/kernel/v6.x/linux-6.3.1.tar.xz |
  bsdtar xvf -

但你也可以xz -d自己调用:

wget -qO - https://cdn.kernel.org/pub/linux/kernel/v6.x/linux-6.3.1.tar.xz |
  xz -d |
  tar xvf -

这适用于任何tar实施。

GNUtar手册有:

读取存档时必须指定解压缩选项的唯一情况是从不支持随机访问的管道或磁带驱动器读取。然而,在这种情况下,GNU“tar”将指示您应该使用哪个选项。例如:

$ cat archive.tar.gz | tar tf -
tar: Archive is compressed.  Use -z option

这里:

$ cat file.tar.xz | tar tf -
tar: Archive is compressed. Use -J option
tar: Error is not recoverable: exiting now

因此,如果使用 GNU tar,您可以显式使用-J--xzfor 来tar调用xz -d以动态解压缩输入流。

wget -qO- https://cdn.kernel.org/pub/linux/kernel/v6.x/linux-6.3.1.tar.xz |
  gnu-tar Jxvf -

无论如何,您忘记了-O -withoutwget会将下载的文件存储到本地文件中,而不是将其打印到 stdout (这里是管道 to ),也许您对默认情况下将下载输出到 stdouttar感到困惑。 (quiet) 与's (silent) 类似,会抑制默认情况下获得的进度信息。wgetcurl-qcurl-s

答案2

像这样:

wget -q -O - https://cdn.kernel.org/pub/linux/kernel/v6.x/linux-6.3.1.tar.xz |
    tar xJvf -
  • -O在这里定义输出文件STDOUT-
  • -q处于安静模式

然后:

cd linux-6.3.1/
ls -1

arch/
block/
certs/
[...]

相关内容