最も簡単な方法は、アーカイブ全体をコピーすることです。私はあなたがそれが大きすぎるのでそれをしたくないと思います。
通常のコマンドラインツール(tar
、pax
)は、アーカイブのメンバーを別のアーカイブにコピーすることをサポートしていません。
所有権を保持する必要がない場合は、FUSEファイルシステムを使用することをお勧めします。archivemountを使用して、アーカイブをファイルシステムとしてマウントできます。ソースアーカイブに対してこれを行い、マウントされたファイルシステムでtarを実行します。
archivemount some.tar.gz mnt
cd mnt
tar -cz subdir | ssh example.com tar -xz
fusermount -u mnt
または、AVFSを使用できます。
mountavfs
cd ~/.avfs$PWD/some.tar.gz\#
tar -cz subdir | ssh example.com tar -xz
または、tar
元のアーカイブで実行し、SSHFS経由でリモートマシンに抽出することもできます。
sshfs example.com: mnt
cd mnt
tar -xf /path/to/some.tar.gz subdir
fusermount -u mnt
ただし、所有権を保持する必要がある場合、これらの方法はすべて面倒です。これらはすべてローカルマシン上のファイルへの抽出を伴うため、このファイルの所有権は意図したリモート所有権でなければなりません。これには、rootとして実行する必要があり、ローカルマシンとリモートホスト間で異なる名前またはIDを持つアカウントがファイルを所有している場合、意図した結果が得られない場合があります。
Pythonのtarfile
ライブラリは、tarメンバーを操作するためのかなり簡単な方法を提供するため、あるtarファイルから別のtarファイルにシャッフルできます。POSIX標準形式(ustar、pax)およびいくつかのGNU拡張機能をサポートしています。以下は、標準入力でtarファイル(gzipまたはbzip2で圧縮されている可能性があります)を読み取り、bzip2で圧縮されたtarファイルを標準出力に書き込む、テストされていないPythonスクリプトです。スクリプトに渡された引数で始まる場合、ソースのメンバーがコピーされます。
#!/usr/bin/env python2
import sys, tarfile
source = tarfile.open(fileobj=sys.stdin)
destination = tarfile.open(fileobj=sys.stdout, mode='w:bz2')
for info in source:
if info.name.startswith(sys.argv[1]):
destination.addfile(info)
destination.close()
として呼び出される
tar_filter <some.tar.gz subdir/ | ssh example.com tar -xj
@original.tar
アプローチがbsdtarで可能であることを知りませんでした。拡張属性と圧縮も同様に機能するようです</var/cache/pacman/pkg/libuv-1.7.0-1-x86_64.pkg.tar.xz bsdtar -czf - --include='usr/share/*' @- | tar tvz
(そして、何らかの理由で空の選択が一連のゼロバイトを生成しますが、それは私にとって大きな問題ではありません)。