POSIXly, आप विकल्प के pax
साथ रीड + राइट मोड में उपयोग करेंगे -l
:
pax -rwlpe -s /A/B/ dirA .
( -pe
फाइलों की सभी संभावित विशेषताओं को सुरक्षित रखता है (इस मामले में केवल निर्देशिकाएं) जो कॉपी की जाती हैं, जैसे कि GNU cp
की -a
है)।
अब, हालांकि मानक , वह आदेश बहुत पोर्टेबल नहीं है ।
सबसे पहले, कई GNU / लिनक्स-आधारित सिस्टम pax
डिफ़ॉल्ट रूप से शामिल नहीं होते हैं (भले ही यह एक गैर-वैकल्पिक POSIX उपयोगिता हो)।
फिर, कई कार्यान्वयन के साथ बग और गैर-अनुरूपता उस कोड के साथ कई मुद्दों का कारण बनते हैं।
- बग के कारण, Solaris 10
pax
(कम से कम) के -rwl
साथ संयोजन में उपयोग करते समय काम नहीं करता है -s
। किसी कारण से, ऐसा लगता है कि यह मूल और प्रतिलिपि किए गए पथ दोनों के प्रतिस्थापन को लागू करता है। इसलिए, इसके link("dirB/file", "dirB/file")
बजाय , यह कुछ करने की कोशिश करेगा link("dirA/file", "dirB/file")
।
- FreeBSD पर,
pax
टाइप सीमलिंक (POSIX द्वारा अनुमत व्यवहार) की फ़ाइलों के लिए हार्डलिंक नहीं बनाता है । इतना ही नहीं, लेकिन यह सिम्बलिंक के लक्ष्यों के प्रतिस्थापन ( पोसिक्स द्वारा अनुमति नहीं दिया गया व्यवहार ) पर भी लागू होता है । तो उदाहरण वहाँ एक है कि अगर के लिए foo -> AA
में सिमलिंक dirA
, यह हो जाएगा foo -> BA
में dirB
।
इसके अलावा, यदि आप ऐसा ही करना चाहते हैं, लेकिन मनमाने फ़ाइल पथों के साथ जिनकी सामग्री में संग्रहीत है, $src
और $dst
यह महसूस करना महत्वपूर्ण है कि यह अंदर pax -rwl -- "$src" "$dst"
की पूर्ण निर्देशिका संरचना बनाता $src
है $dst
(जिसका अस्तित्व है और एक निर्देशिका बनना है)। उदाहरण के लिए, यदि $src
है foo/bar
, तो $dst/foo/bar
बनाया गया है।
यदि इसके बजाय, आप इसकी $dst
एक प्रति बनना चाहते हैं, तो $src
शायद यह करना सबसे आसान है:
absolute_dst=$(umask 077 && mkdir -p -- "$dst" && cd -P -- "$dst" && pwd -P) &&
(cd -P -- "$src" && pax -rwlpe . "$absolute_dst")
(जो ऊपर बताई गई अधिकांश समस्याओं के आसपास भी काम करेगा, लेकिन यदि $dst
नई वर्णमाला में समाप्त होने का पूर्ण मार्ग है तो विफल हो जाएगा )।
अब यह GNU / Linux सिस्टम पर मदद नहीं करेगा जहाँ कोई नहीं है pax
।
यह ध्यान रखना दिलचस्प है कि pax
POSIX द्वारा tar
और cpio
कमांड की विशेषताओं को मर्ज करने के लिए बनाया गया था ।
cpio
POSIX आविष्कार के विपरीत एक ऐतिहासिक यूनिक्स कमांड (1977 से) है, और एक GNU कार्यान्वयन भी है (एक नहीं pax
)। तो भले ही यह एक मानक कमांड नहीं है (हालांकि यह SUSv2 में था), यह अभी भी बहुत आम है, और इसमें उन विशेषताओं का एक मुख्य समूह है, जिन पर आप आमतौर पर भरोसा कर सकते हैं।
के बराबर pax -rwl
होगा cpio -pl
। हालाँकि:
cpio
तर्कों पर विरोध के रूप में इनपुट फ़ाइल की सूची लेता है (newline सीमांकित जिसका अर्थ है कि newline वर्णों के साथ फ़ाइल नाम समर्थित नहीं हैं)
- सभी फ़ाइलें (आमतौर पर आप इसे के उत्पादन को खिलाने के लिए निर्दिष्ट किया जा करने के लिए है
find
( find
और cpio
) एक ही लोगों द्वारा संयुक्त रूप से विकसित किया गया)।
- मेटाडेटा संरक्षित नहीं है (कुछ
cpio
कार्यान्वयन में कुछ को संरक्षित करने के विकल्प हैं, लेकिन कुछ भी नहीं पोर्टेबल)।
तो इसके साथ cpio
:
absolute_dst=$(umask 077 && mkdir -p -- "$dst" && cd -P -- "$dst" && pwd -P) &&
(cd -P -- "$src" && find . | cpio -pl "$absolute_dst")
pax
, FreeBSD पर,cp -a
हार्डलिंक सिमलिंक को पसंद नहीं करता है।