मैं निर्देशिका को कॉपी कैसे कर सकता हूं?


167

मैं एक कार्यशील निर्देशिका से एक सर्वर (एक ही मशीन) के लिए एक परियोजना को मंच देने की कोशिश कर रहा हूं। निम्नलिखित कोड का उपयोग करना:

gulp.src([
    'index.php',
    'css/**',
    'js/**',
    'src/**',
])
.pipe(gulp.dest('/var/www/'));

मैं सभी फाइलों की नकल देखने की उम्मीद करूंगा। हालाँकि यह dir संरचना को समतल करता है - सभी निर्देशिकाओं की प्रतिलिपि बनाई जाती है लेकिन प्रत्येक फ़ाइल को रूट में रखा जाता है/var/www

एक महान निर्माण उपकरण की तरह लगता है, लेकिन वस्तुओं की नकल निश्चित रूप से एक सरल प्रक्रिया होनी चाहिए?


9
इस प्रश्न को पढ़ने वाले किसी भी नए दर्शकों के लिए, यह ध्यान दिया जाना चाहिए कि उच्चतम मतदान वाला उत्तर, फ़्लिकरिंग निर्देशिकाओं के मूल प्रश्न विनिर्देश को हल करने के लिए काम नहीं करता है। यह उन समस्याओं को हल करता है जो एक निर्देशिका के अंदर सभी फाइलों को कॉपी होने से नहीं रोक रही हैं, इसलिए यह उपयोगी है!
एमकेके

1
सपाट नहीं होने से, क्या आपका मतलब है कि आप 'सीएसएस', 'जेएस' और 'एसकेसी' निर्देशिकाओं में उपस्थित होना /var/www/चाहते हैं? आप कोशिश कर सकते हैं{css,js,src}/**/*
जेसन गोएमाट

मुझे पता है कि ग्लोब विस्तार gulp के अंदर काम करता है, लेकिन अगर किसी सूची में एक अलग लाइन के रूप में प्रत्येक आइटम के लिए अलग-अलग काम किया है तो मैं भ्रमित हो जाऊंगा - क्योंकि ग्लोब विस्तार मूल रूप से निष्पादन से पहले एक सूची में विस्तार करना है।
M1ke

जवाबों:


319

फ़ोल्डर संरचना को समतल किए बिना निम्नलिखित कार्य करता है:

gulp.src(['input/folder/**/*']).pipe(gulp.dest('output/folder'));

'**/*'महत्वपूर्ण हिस्सा है। वह अभिव्यक्ति एक ग्लोब है जो एक शक्तिशाली फ़ाइल चयन उपकरण है। उदाहरण के लिए, केवल .js फ़ाइलों का उपयोग करने के लिए:'input/folder/**/*.js'


2
लगता है कि आप gulp.dest जोड़ना भूल गए। होना चाहिए.pipe(gulp.dest('output/folder'));
मैथ्यू स्पैन्कल

3
आप एक विशिष्ट फ़ाइल एक्सटेंशन के साथ ऐसा कैसे करते हैं?
Chev

1
क्या आप फ़ाइलों के मूल सेट के लिए एक उदाहरण प्रदान करने के लिए उत्तर को संपादित कर सकते हैं? मैं अनिश्चित हूं कि यह कैसे अधिक उचित है, लेकिन मुझे यह देखकर खुशी होगी कि यह {base:"."}विधि की तुलना में कैसे काम करता है ।
M1ke

2
यह ध्यान रखना महत्वपूर्ण है कि baseडिफ़ॉल्ट "फ़ोल्डर" है जैसा कि इस उत्तर में दिया गया है। दूसरे शब्दों में, आधार वहां शुरू होता है जहां ग्लोब पैटर्न शुरू होता है। इससे मुझे यह समझने में मदद मिली कि मेरी फाइलें कहां समाप्त होंगी और यह भी कि आपको पैरामीटर **/*में इसकी आवश्यकता क्यों नहीं है gulp.dest। ग्लॉप ग्लोब में सब कुछ लेता है और इसे उसी संरचना के साथ नियत फ़ोल्डर में डालता है।
नील मुनरो

3
यह पूछे जा रहे सवाल का पूरी तरह से जवाब नहीं देता है। यह कैसे पुनरावृत्ति को सही ढंग से कॉपी करने के लिए एक अच्छा समाधान है, लेकिन इसका जवाब नहीं है कि आधार निर्देशिका को कैसे संशोधित किया जाए।
ty1824

173

पता चलता है कि एक पूरी निर्देशिका संरचना gulpकी प्रतिलिपि बनाने के लिए आपकी gulp.src()विधि के लिए एक आधार प्रदान किया जाना चाहिए ।

तो gulp.src( [ files ], { "base" : "." })ऊपर की संरचना में सभी निर्देशिकाओं की नकल करने के लिए उपयोग किया जा सकता है।

अगर, मेरी तरह, आप इसे भूल सकते हैं तो कोशिश करें:

gulp.copy=function(src,dest){
    return gulp.src(src, {base:"."})
        .pipe(gulp.dest(dest));
};

1
वर्तमान कार्यशील निर्देशिका को सेट करने के लिए "cwd" कॉन्फ़िगरेशन जोड़ें।
स्कार्लॉट

3
यदि baseआप अभी भी भ्रमित कर रहे हैं, तो stackoverflow.com/a/35848322/11912 पर एक नज़र डालें जो इसे समझाने का एक बड़ा काम करता है।
जेम्स स्कम्प

60

इसलिए - आधार कार्यों को प्रदान करने का समाधान यह दिया गया है कि सभी रास्तों का आधार पथ एक ही है। लेकिन अगर आप अलग-अलग आधार पथ प्रदान करना चाहते हैं, तो भी यह काम नहीं करेगा।

जिस तरह से मैंने इस समस्या को हल किया, वह पथ की शुरुआत को सापेक्ष बनाकर था। आपके मामले के लिए:

gulp.src([
    'index.php',
    '*css/**/*',
    '*js/**/*',
    '*src/**/*',
])
.pipe(gulp.dest('/var/www/'));

यह काम करता है इसका कारण यह है कि गुलप ने आधार को पहले स्पष्ट चंक के अंत होने के लिए सेट किया है - अग्रणी * इसका कारण सीडब्ल्यूडी पर आधार सेट करना है (जो कि वह परिणाम है जो हम सभी चाहते हैं!)

यह केवल तभी काम करता है जब आप यह सुनिश्चित कर सकते हैं कि आपके फ़ोल्डर की संरचना में कुछ निश्चित रास्ते नहीं होंगे जो दो बार मेल खा सकते हैं। उदाहरण के लिए, यदि आपके पास randomjs/उसी स्तर पर था, तो आप jsदोनों का मिलान समाप्त कर देंगे।

यह एकमात्र तरीका है जो मैंने इन्हें एक शीर्ष-स्तरीय gulp.src फ़ंक्शन के भाग के रूप में शामिल करने के लिए पाया है। यह एक प्लगइन / फ़ंक्शन बनाने के लिए सरल होगा जो उन सभी ग्लब्स को अलग कर सकता है ताकि आप उनके लिए आधार निर्देशिका को निर्दिष्ट कर सकें।


मुझे लगता है कि कई आधार रास्तों के साथ शुरू करने के बाद शायद सवाल के दायरे से परे हो जाता है। अपने मूल प्रश्न से मैं फ़ाइलों को निरपेक्ष पथ पर ले जा रहा था, लेकिन समस्या अभी भी बनी हुई है, कि एक आधार को निर्दिष्ट किए बिना, मेरे सभी ग्लोब की सभी फ़ाइलों को उनके मौजूदा पदानुक्रम के बिना एक ही निर्देशिका में कॉपी किया गया था।
M1ke 8

2
@ M1ke यह सच है, आपके प्रश्न का मुख्य बिंदु अलग-अलग आधार रास्तों पर निर्देशित नहीं था। हालाँकि, आपने उल्लेख किया है However it flattens the dir structure - all directories are copied but every file is placed in the root /var/www, और यह वास्तव में है कि मैंने आपका प्रश्न कैसे पाया - मैं विभिन्न समाधानों के साथ पुनरावर्ती रूप से प्रतिलिपि बनाने के तरीके के बारे में खोज कर रहा था। अनिवार्य रूप से, यह समाधान डिफ़ॉल्ट आधार को निर्दिष्ट किए बिना आपके मामले के लिए काम करता है, लेकिन एक बहु-आधार पथ मामले के लिए भी, जब तक आप यह सुनिश्चित कर सकते हैं कि अग्रणी स्टार कुछ भी नहीं मिला :)
ty1824

6
यह उत्तर असाधारण है। यह विशेष रूप से एक मनमाना शुरुआत बिंदु से एक मार्ग की नकल करने के साथ संबंधित है, जैसे। src 'assets/subdir/*fonts/*'फोंट की नकल करने के लिए हो सकता है।
Wtower

-4

यदि आप किसी फ़ोल्डर की संपूर्ण सामग्री को पुन: किसी अन्य फ़ोल्डर में कॉपी करना चाहते हैं, तो आप निम्न विंडो कमांड को gulp से निष्पादित कर सकते हैं:

xcopy /path/to/srcfolder /path/to/destfolder /s /e /y

/yअंत में विकल्प अधिलेखित पुष्टि संदेश को दबाने के लिए है।

लिनक्स में, आप gulp से निम्न कमांड निष्पादित कर सकते हैं:

cp -R /path/to/srcfolder /path/to/destfolder

आप gulp से सिस्टम कमांड निष्पादित करने के लिए gulp-exec या gulp-run प्लगइन का उपयोग कर सकते हैं ।

सम्बंधित लिंक्स:

  1. xcopy उपयोग

  2. gulp-exec और gulp-run


7
यहां वापस शेल में गिरने के साथ समस्या यह है कि आप स्ट्रीम पर अन्य कमांड चलाने की क्षमता खो देंगे, जैसे कि संपीड़न या एनालिटिक्स टूल।
M1ke सेप
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.