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

エラーが発生するたびに。しかし、次の2つのコマンドはうまく機能します。

$ 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呼び出されますが、何らかの理由で-

libarchiveジョブに切り替えるbsdtar

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 -

とにかく、ダウンロードしたファイルをstdout(ここではstdoutとしてパイプ)として印刷するのではなく、ローカルファイルに保存することを忘れてしまったかもしれません。ダウンロードが-O -デフォルトwgetでstdoutとして出力されるという事実にtar混乱する可能性があります。 (quiet) の (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/
[...]

関連情報