Il modo più semplice sarebbe copiare l'intero archivio; Presumo che tu non voglia farlo perché è troppo grande.
I soliti strumenti da riga di comando ( tar
, pax
) non supportano la copia dei membri di un archivio in un altro archivio.
Se non fosse necessario preservare la proprietà, suggerirei di utilizzare i filesystem FUSE . Puoi usare archivemount per montare un archivio come filesystem; fallo per l'archivio sorgente ed esegui tar sul filesystem montato.
archivemount some.tar.gz mnt
cd mnt
tar -cz subdir | ssh example.com tar -xz
fusermount -u mnt
In alternativa, è possibile utilizzare AVFS :
mountavfs
cd ~/.avfs$PWD/some.tar.gz\#
tar -cz subdir | ssh example.com tar -xz
In alternativa, è possibile eseguire tar
sull'archivio originale ed estrarre sul computer remoto tramite SSHFS .
sshfs example.com: mnt
cd mnt
tar -xf /path/to/some.tar.gz subdir
fusermount -u mnt
Tuttavia, tutti questi metodi sono ingombranti se è necessario preservare la proprietà. Tutti implicano l'estrazione in un file sul computer locale, quindi la proprietà di questo file dovrà essere la proprietà remota prevista . Ciò richiede l'esecuzione come root e potrebbe non dare il risultato desiderato se i file sono di proprietà di account che hanno nomi o ID che differiscono tra il computer locale e l'host remoto.
La tarfile
libreria di Python fornisce un modo abbastanza semplice per manipolare i membri tar, in modo da poterli mescolare da un file tar all'altro. Supporta formati standard POSIX (ustar, pax) e alcune estensioni GNU. Ecco uno script Python non testato che legge un file tar (possibilmente compresso con gzip o bzip2) sul suo input standard e scrive un file tar compresso con bzip2 sul suo output standard. I membri dell'origine vengono copiati se iniziano con l'argomento passato allo script.
#!/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()
Da invocare come
tar_filter <some.tar.gz subdir/ | ssh example.com tar -xj
@original.tar
approccio fosse possibile con bsdtar. Sembra funzionare anche con attributi estesi e compressione</var/cache/pacman/pkg/libuv-1.7.0-1-x86_64.pkg.tar.xz bsdtar -czf - --include='usr/share/*' @- | tar tvz
(e per qualche ragione una selezione vuota produce una serie di zero byte, ma questo non è un grosso problema per me).