2009-10-30 3 views
70

मुझे उम्मीद थी:बैश: फ़ाइलों रिकर्सिवली नामित कॉपी, संरक्षण फ़ोल्डर संरचना

cp -R src/prog.js images/icon.jpg /tmp/package 

गंतव्य निर्देशिका में एक सममित संरचना प्राप्त होते हैं:

/tmp 
| 
+-- package 
    | 
    +-- src 
    | | 
    | +-- prog.js 
    | 
    +-- images 
     | 
     +-- icon.jpg 

लेकिन इसके बजाय, फ़ाइलों की दोनों कॉपी कर रहे हैं में/tmp/पैकेज में। एक फ्लैट प्रति। (यह ओएसएक्स पर है)।

क्या कोई साधारण बैश फ़ंक्शन है जिसका उपयोग मैं सभी फ़ाइलों की प्रतिलिपि बनाने के लिए कर सकता हूं, जिसमें वाइल्डकार्ड (उदा। Src/*। Js) द्वारा निर्दिष्ट फ़ाइलों को गंतव्य निर्देशिका में उनके सही स्थान पर निर्दिष्ट किया गया है। थोड़ा सा "प्रत्येक फ़ाइल के लिए, mkdir -p $(dirname "$file"); cp "$file" $(dirname "$file") चलाएं", लेकिन शायद एक ही कमांड।

This is a relevant thread, which suggests it's not possible. लेखक का समाधान मेरे लिए इतना उपयोगी नहीं है, क्योंकि मैं केवल फाइलों, वाइल्डकार्ड की सूची प्रदान करना चाहता हूं या नहीं, और उन सभी को गंतव्य डीआईआर में कॉपी किया गया है। आईआईआरसी एमएस-डॉस xcopy यह करता है, लेकिन सीपी के लिए कोई समकक्ष नहीं लगता है।

उत्तर

111

क्या आपने --parents विकल्प का उपयोग करने का प्रयास किया है? मुझे नहीं पता कि ओएस एक्स इसका समर्थन करता है, लेकिन यह लिनक्स पर काम करता है।

cp --parents src/prog.js images/icon.jpg /tmp/package 

कि ओएस एक्स पर काम नहीं करता है,

rsync -R src/prog.js images/icon.jpg /tmp/package 

के रूप में एआईएफ सुझाव दिया की कोशिश करो।

+0

ठीक है तो मैंने बहुत जल्द बात की। मुझे यह जवाब सबसे अच्छा लगता है। – EMPraptor

+3

धन्यवाद। मैक पर "सीपी - पारेन्ट्स" संभव नहीं है, लेकिन अन्य यूनिक्स के लिए ध्वज को जानना अच्छा लगता है। rsync -R इस समस्या के लिए सबसे सरल पोर्टेबल समाधान है। – mahemoff

+1

मैंने इसे अपने लालित्य/यादगारता के लिए स्वीकार किया, लेकिन अभी पता चला है कि यह पूरी निर्देशिका (कम से कम ओएसएक्स पर) की प्रतिलिपि नहीं करता है, जबकि नीचे वाला टैर एक करता है। – mahemoff

20

एक ही रास्ता:

tar cf - <files> | (cd /dest; tar xf -) 
+0

ओह, मैं इतना मेरा उत्तर की तुलना में बेहतर पसंद है। – EMPraptor

+3

आप अपने लिए chdir करने के लिए '-C' विकल्प का भी उपयोग कर सकते हैं -' tar cf - _files_ | tar -C/dest xf -' या ऐसा कुछ। –

+0

धन्यवाद, यह संक्षेप में है, हालांकि मैं सादगी के लिए rsync पसंद करते हैं। – mahemoff

1

का प्रयास करें ...

for f in src/*.js; do cp $f /tmp/package/$f; done 

तो आप मूल रूप से क्या कर रहे थे के लिए ...

for f in `echo "src/prog.js images/icon.jpg"`; do cp $f /tmp/package/$f; done 

या

v="src/prog.js images/icon.jpg"; for f in $v; do cp $f /tmp/package/$f; done 
13

वैकल्पिक रूप से, अगर आप ओल्ड-स्कूल कर रहे हैं, केन्द्रीय लोक सूचना अधिकारी का उपयोग करें:

cd /source; 
find . -print | cpio -pvdmB /target 

जाहिर है, आप अपने दिल की सामग्री के लिए फ़ाइल सूची को फ़िल्टर कर सकते हैं।

'-पी' विकल्प 'पास-थ्रू' मोड के लिए है (इनपुट के लिए '-i' या आउटपुट के लिए '-o' के रूप में)। '-v' वर्बोज़ है (फ़ाइलों को सूचीबद्ध करें क्योंकि उन्हें संसाधित किया गया है)। '-एम' संशोधन के समय को संरक्षित करता है। '-बी' का अर्थ है 'बड़े ब्लॉक' (जहां 512 बाइट्स के बजाय बड़े ब्लॉक 5120 बाइट्स हैं); यह संभव है कि इन दिनों इसका कोई प्रभाव न हो।

+0

फ़िल्टरिंग के लिए सबसे अच्छा जवाब! धन्यवाद – milkplus

13

rsync's -R option आप क्या उम्मीद करेंगे। यह एक बहुत ही फीचर समृद्ध फ़ाइल कॉपीियर है।

$ rsync -Rv src/prog.js images/icon.jpg /tmp/package/ 
images/ 
images/icon.jpg 
src/ 
src/prog.js 

sent 197 bytes received 76 bytes 546.00 bytes/sec 
total size is 0 speedup is 0.00 

नमूना परिणाम: उदाहरण के लिए:

$ find /tmp/package 
/tmp/package 
/tmp/package/images 
/tmp/package/images/icon.jpg 
/tmp/package/src 
/tmp/package/src/prog.js 

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^