सबसे आसान तरीका पूरे संग्रह की प्रतिलिपि बनाना होगा; मुझे लगता है कि आप ऐसा नहीं करना चाहते क्योंकि यह बहुत बड़ा है।
सामान्य कमांड लाइन टूल ( ) tar
, pax
एक संग्रह के सदस्यों को दूसरे संग्रह में कॉपी करने का समर्थन नहीं करते हैं।
यदि आपको स्वामित्व को संरक्षित करने की आवश्यकता नहीं है, तो मैं सुझाव देता हूं कि FUSE फाइल सिस्टम का उपयोग करें । आप एक पुरालेख को फाइलसिस्टम के रूप में माउंट करने के लिए आर्कमाउंट का उपयोग कर सकते हैं ; स्रोत संग्रह के लिए ऐसा करें, और माउंटेड फ़ाइल सिस्टम पर टार चलाएं।
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
हालाँकि ये सभी तरीके बोझिल हैं यदि आपको स्वामित्व को संरक्षित करने की आवश्यकता है। वे सभी स्थानीय मशीन पर एक फ़ाइल को निकालने में शामिल हैं, इसलिए इस फ़ाइल के स्वामित्व का इरादा दूरस्थ स्वामित्व होना चाहिए । इसे रूट के रूप में चलाने की आवश्यकता होती है और यदि फाइल स्थानीय या मशीन और दूरस्थ होस्ट के बीच भिन्न नाम या आईडी वाले खातों के स्वामित्व में है, तो यह अपेक्षित परिणाम नहीं दे सकता है।
पायथन की tarfile
लाइब्रेरी टार सदस्यों को हेरफेर करने के लिए एक काफी आसान तरीका प्रदान करती है, इसलिए आप उन्हें एक टार फाइल से दूसरे में फेरबदल कर सकते हैं। यह POSIX मानक प्रारूपों (ustar, pax) के साथ-साथ कुछ GNU एक्सटेंशन का समर्थन करता है। यहां एक अप्रमाणित पाइथन स्क्रिप्ट है जो अपने मानक इनपुट पर एक टार फाइल (संभवतः gzip या bzip2 के साथ संपीड़ित) पढ़ती है और अपने मानक आउटपुट पर bzip2 के साथ एक टार फाइल संपीड़ित लिखती है। यदि वे स्क्रिप्ट से पास किए गए तर्क से शुरू करते हैं, तो स्रोत से सदस्यों की प्रतिलिपि बनाई जाती है।
#!/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
(और किसी कारण से एक खाली चयन शून्य बाइट्स की एक श्रृंखला का उत्पादन करता है, लेकिन यह मेरे लिए कोई बड़ी समस्या नहीं है)।