tar アーカイブから現在のディレクトリに特定のファイルを抽出するには?

tar アーカイブから現在のディレクトリに特定のファイルを抽出するには?

次のようにtarアーカイブから特定のファイルを抽出できます。

tar xvf gh_2.5.1_linux_armv6.tar.gz gh_2.5.1_linux_armv6/bin/gh

これにより現在のディレクトリに抽出されますが、ghファイルはまだアーカイブのディレクトリ構造内にあります。現在または特定のディレクトリにファイルを抽出する方法はありますか?

答え1

Gnu tarの場合は、以下を試してください。

tar xvf gh_2.5.1_linux_armv6.tar.gz --one-top-level=. gh_2.5.1_linux_armv6/bin/gh

--one-top-levelまたは、コメントで提案されているように、この例では代わりに使用しますが、--strip-components=2別のディレクトリから複数のファイルを抽出したい場合は機能しない可能性があります。

答え2

GNU tarを使用して応答します。

tar xvf gh_2.5.1_linux_armv6.tar.gz gh_2.5.1_linux_armv6/bin/gh -O > gh

上記のコードブロックを試してみてください。Oオプションは、出力を標準出力にすることです。したがって、これをリダイレクト演算子と組み合わせます。

答え3

説明で示したように、このオプションは--strip-components=Nアーカイブの同じレベルにある単一のファイルまたは複数のファイルに対してうまく機能します。アーカイブ内の任意の数のファイルに対して機能する別のGNUオプションは
(またはtar--xform--transform)。次の形式の代替式を使用して
ファイル名を変更できます。sed

s/regexp/replace/[flags]

したがって、あなたの場合、式はs|.*/||ファイルパスからすべての主要コンポーネントを削除します。

tar xvf gh_2.5.1_linux_armv6.tar.gz  --xform='s|.*/||' gh_2.5.1_linux_armv6/bin/gh

gh親ディレクトリなしで現在のディレクトリのファイルのみを抽出します。また、--show-transformed-namesテストの実行など、要求された変換を適用するオプションも表示できます。

tar -tf archive.tar.gz --xform='s|.*/||' --show-transformed-names

これは、パターンに基づいて別のディレクトリに抽出するなど、他のオプションと組み合わせることができます。

tar -xvzf archive.tar.gz --xform='s|.*/||' -C dest_dir --wildcards --no-anchored 'match*'

関連情報