2012-09-30 11 views
7

के साथ निर्देशिका संरचना को संरक्षित करने वाली फ़ाइलों की प्रतिलिपि बनाएँ मेरा लक्ष्य लक्ष्य dir को पैटर्न द्वारा निर्दिष्ट फ़ाइलों के एक सेट की प्रतिलिपि बनाना है। स्रोत निर्देशिका में फ़ाइलों में subdirs हो सकता है।रेक

मैंने कोशिश की:

cp_r(Dir.glob('**/*.html'), @target_dir): 

और

cp_r(FileList['**/*.html'], @target_dir): 

लेकिन न तो काम करते हैं।

यह केवल काम करता है जब मैं की तरह कुछ कार्य करें:

cp_r(Dir['.'], @target_dir): 

लेकिन मैं केवल * .html फ़ाइलों और नहीं कुछ भी कॉपी करना होगा।

मैं क्या

cp --parents 

कमान करता

मौजूदा रूबी/रैक तरीकों का उपयोग कर किसी भी सलाह की जरूरत है?

अद्यतन चींटी की तरह लग रहा है जो चींटी के साथ आसान है, रूबी/रेक स्टैक के साथ संभव नहीं है - मुझे कुछ और देखने की आवश्यकता होगी। मैं रूबी में काम करने के लिए कस्टम कोड लिखना नहीं चाहता हूं। मैंने बस रूबी/रेक के बारे में सोचा कि उचित समाधान के रूप में।

अद्यतन 2 यह मैं इसे कैसे चींटी

<target name="buildeweb" description="Builds web site" depends="clean"> 
    <mkdir dir="${build.dir.web}" /> 

    <copy todir="${build.dir.web}" verbose="true"> 
     <fileset dir="${source.dir.web}"> 
      <include name="**/*.html" /> 
      <include name="**/*.htm" /> 
     </fileset> 
    </copy> 

    <chmod perm="a+x"> 
     <fileset dir="${build.dir.web}"> 
      <include name="**/*.html" /> 
      <include name="**/*.htm" /> 
     </fileset> 
    </chmod> 
</target> 
+0

आप सब कुछ नकल कर सकता है, तो जो कि .html नहीं कर रहे हैं हटा दें। यह आसान होगा, क्योंकि आपको पथों के साथ परेशान करने की आवश्यकता नहीं है। – d11wtq

+0

@ d11wtq, यह एक अच्छा समाधान नहीं है क्योंकि इस मामले में आपको दो अतिरिक्त चीजें करने की आवश्यकता है: अनइडेड फ़ाइलों की प्रतिलिपि बनाएँ, फिर अनइडेड फ़ाइलों को हटाएं। – Vladimir

उत्तर

5

आप शुद्ध रूबी चाहते हैं, आप (मानक पुस्तकालय में FileUtils की थोड़ी सी सहायता के साथ) कर सकते हैं।

require 'fileutils' 

Dir.glob('**/*.html').each do |file| 
    dir, filename = File.dirname(file), File.basename(file) 
    dest = File.join(@target_dir, dir) 
    FileUtils.mkdir_p(dest) 
    FileUtils.copy_file(file, File.join(dest,filename)) 
end 
+1

हाय @ मार्क, मुझे शुद्ध रूबी समाधान चाहिए, हाँ। लेकिन मुझे एक और अधिक क्लीनर घोषणात्मक दृष्टिकोण चाहिए। मैंने सोचा कि कस्टम कोड लिखने के बिना रुबी/रेक स्टैक के साथ ऐसा स्वचालन संभव है। मैं कुछ और घोषणात्मक पसंद करूंगा जैसे: cp_r (, लक्ष्य) किसी भी अजीब तरीकों को लिखने की आवश्यकता के बिना। ऐसा लगता है कि यह Std के साथ असंभव है। रूबी/रेक स्टैक - और मुझे बैश या चींटी में फॉलबैक करने की आवश्यकता हो सकती है। – Vladimir

0

मैं cp --parents के बारे में सुना नहीं किया है के साथ क्या है, लेकिन अगर यह तुम क्या चाहते करता है तो सिर्फ अपने Rakefile से इसे प्रयोग करने में कोई शर्म की बात है है , इस तरह:

system("cp --parents #{your} #{args}") 
+0

हाय @ डेविड, सलाह के लिए धन्यवाद। मैंने कल भी इससे पहले नहीं सुना है :-) मुझे एक और क्लीनर समाधान चाहिए जो सिस्टम कमांड को कॉल करने की आवश्यकता नहीं है लेकिन शुद्ध रूबी में काम करता है, मैंने सोचा कि इसे रूबी में हल किया जा सकता है - अन्यथा मैं बैश लिख सकता हूं इसके बजाय स्क्रिप्ट। – Vladimir

0

यह उपयोगी हो सकता है:

# copy "files" to "dest" with any sub-folders after "src_root". 
def copy_and_preserve files, dest, src_root 
    files.each {|f| 
    f.slice! src_root # the files without src_root dir 
    dest_dir = File.dirname(File.join(dest, f)) 
    FileUtils.mkdir_p dest_dir # make dest dir 
    FileUtils.cp(File.join(src_root, f), dest_dir, {:verbose => true}) 
    } 
end 
संबंधित मुद्दे