ओएस एक्स पर तोड़फोड़ फ़ाइलों और फ़ोल्डरों को छोड़कर सभी फाइलों और फ़ोल्डरों को कॉपी करें


14

मैं सभी फाइलों और फ़ोल्डरों को एक डायरेक्टरी से दूसरी डायरेक्टरी में कॉपी करने की कोशिश कर रहा हूं, लेकिन कुछ फाइलों को छोड़ दें। विशेष रूप से, मैं तोड़फोड़ फ़ाइलों और फ़ोल्डरों को बाहर करना चाहता हूं। हालाँकि, मैं एक सामान्य अभी तक संक्षिप्त समाधान चाहूँगा।

मुझे लगता है कि मुझे निकट भविष्य में कई प्रकार की फ़ाइलों को बाहर करने की आवश्यकता होगी। उदाहरण के लिए, मैं .svn, * .bak, और * .prj को बाहर करना चाह सकता हूं।

यहाँ मैंने इसके लिए एक साथ रखा है, लेकिन यह मेरे लिए काम नहीं कर रहा है। पहला भाग, काम ढूंढता है , लेकिन मैं xargs और cp के साथ कुछ गलत कर रहा हूं । मैं के साथ और बिना cp की कोशिश की -R। इसके अलावा, मैं ओएस एक्स का उपयोग कर रहा हूं और इसमें लिनक्स सिस्टम की तुलना में xargs का कम चित्रित संस्करण है ।

find ./sourcedirectory -not \( -name .svn -a -prune \)
     | xargs -IFILES cp -R FILES ./destinationdirectory

मैं गलत हो सकता हूं, लेकिन मुझे लगता है कि यह आपकी सोच से कहीं ज्यादा मुश्किल है। यहां तक ​​कि अगर आपका findआदेश -prune.svn आइटम को बाहर करने के लिए ठीक से उपयोग करता है, तो आप उस -Rध्वज को पास करते हैं cpजो उस आदेश को पुनरावर्ती बताता है । जब यह ऐसा होता है, तो आपके पास findकमांड में जो भी ग्रैन्युलैरिटी होती है, आप खो देते हैं । मैं इसके साथ एक मिनट के लिए छेड़छाड़ करने जा रहा हूं, लेकिन मुझे लगता है कि इसका जवाब कमांड में उपयोग नहीं करना है । -Rcp
टेलीमेकस

यह मेरे लिए लिनक्स सिस्टम पर काम करने लगता है। क्या आप अधिक विशिष्ट हो सकते हैं जैसा कि "यह काम नहीं कर रहा है" का अर्थ है? कोई त्रुटि संदेश? फ़ाइलें प्राप्त / कॉपी नहीं हो रही हैं जिसकी आपको उम्मीद है?
अगली सूचना तक रोक दिया गया।

यह -Rझंडा है, मुझे पूरा यकीन है। उसे निकालें और आपको ठीक होना चाहिए (हालाँकि आप -mindepth 1toplevel निर्देशिका फ़ोल्डर को अनदेखा करना चाहते हैं, जिसे आप कॉपी नहीं करना चाहते हैं, मुझे लगता है)
Telemachus

मैं आमतौर पर हर चीज की नकल करके इन चीजों को करता हूं, और फिर अनचाहे फाइलों को लक्ष्य निर्देशिकाओं में हटा देता हूं। यह अक्सर बहुत सरल है।
जनवरी डॉगगेन

जवाबों:


22

(प्रश्न को दोबारा पढ़ने के बाद संपादित किया गया। प्रश्नकर्ता का कहना है कि rsync स्थापित नहीं है)

आपके खोज / xargs समाधान के साथ एक संभावित समस्या फ़ाइल नाम में रिक्त स्थान है। उस के बारे में जानने के लिए, ढूँढें और xargs को एक अशक्त वर्ण (ASCII 0) का उपयोग करके मिली फ़ाइलों को अलग करने के लिए कहें:

find ./sourcedirectory -not ( -name .svn -a -prune ) -print0 | xargs -0 -IFILES cp FILES ./destinationdirectory

यदि आप पाते हैं कि rsync उपलब्ध है, तो मुझे अभी भी लगता है कि rsync कहीं बेहतर समाधान है:

-C विकल्प के साथ rsync का उपयोग करें। से rsync आदमी पेज :

यह उन फ़ाइलों की एक विस्तृत श्रृंखला को बाहर करने के लिए एक उपयोगी शॉर्टहैंड है जिन्हें आप अक्सर सिस्टम के बीच स्थानांतरित नहीं करना चाहते हैं। यह सीवीएस के लिए एक समान एल्गोरिथ्म का उपयोग करता है यह निर्धारित करने के लिए कि किसी फ़ाइल को अनदेखा किया जाना चाहिए।

यह इन पैटर्न को अनदेखा करने के लिए rsync को बताएगा:

RCS SCCS CVS CVS.adm RCSLOG cvslog.* tags TAGS .make.state .nse_depinfo *~
#* .#* ,* _$* *$ *.old *.bak *.BAK *.orig *.rej .del-* *.a *.olb *.o *.obj 
*.so *.exe *.Z *.elc *.ln core .svn/ .git/ .bzr/

उदाहरण के लिए:

rsync -avC /path/to/source/directory /path/to/destination/directory

(ध्यान दें: यदि आप अभी तक rsync से परिचित नहीं हैं, तो उस आदमी पृष्ठ पर पढ़ना सुनिश्चित करें कि स्रोत पथ में अनुगामी स्लैश के साथ rsync कैसे व्यवहार करता है। यदि आप स्लैश को शामिल नहीं करते हैं तो यह अलग तरह से व्यवहार करता है। 'अनुगामी स्लेश' की खोज करें)


ओह चूहों, मैंने आपके प्रश्न को फिर से पढ़ा और देखा कि आपने कहा था कि आपके पास rsync स्थापित नहीं है। मेरे मैकबुक प्रो पर (OS X 10.6.1) यह / usr / bin / rsync में है। यह मेरे लिए टाइगर (10.4) और तेंदुए (10.5) के तहत भी स्थापित किया गया था।
डग हैरिस

मुझे पूरा यकीन है कि आप (और ओपी) कमांड -Rके xargsहिस्से में झंडा नहीं चाहते हैं ।
तेलेमाचस

अच्छी पकड़, मैंने मूल प्रश्न से नकल की। अब संपादित करेंगे।
डॉग हैरिस

1
धन्यवाद डौग! एक बात मैं उपदेश देता हूं, "नौकरी के लिए सही उपकरण का उपयोग करें"। मैं हाल ही में विंडोज़ की दुनिया से OSX में आया हूँ और अभी भी अज्ञानता में इधर-उधर लड़खड़ा रहा हूँ। मैंने एक ही प्रश्न को एक linux चैनल में पोस्ट किया और किसी ने जल्दी से कहा, बस "rsynch" का उपयोग करें मैंने टर्मिनल में "rsynch" टाइप किया और देखा कि यह मौजूद नहीं था और खोज की जांच जारी रखी। xargs दृष्टिकोण। मैं थोड़ा जिद्दी हूं। किसी भी तरह, OSX में डिफ़ॉल्ट रूप से "rsync" होता है, और आपका पोस्ट बहुत सहायक था। मेरे पास अभी तक इतना अनुभव नहीं है कि कौन बेहतर है, लेकिन rsync यकीन है कि अधिक संक्षिप्त है। धन्यवाद!
माइकल प्रेस्कॉट

यदि आप OS X पर अपने काम के अलावा लिनक्स मशीनों के साथ कोई काम कर रहे हैं, तो मुझे लगता है कि आप rsync का उपयोग करना सीखने के लिए अपने समय के लायक पाएंगे। इसकी प्राथमिक कार्यक्षमता सिर्फ बदले हुए सामान (जैसे विंडोज़ पर रोबोकॉपी, यदि आप उस से परिचित हैं) की बुद्धिमान प्रतिलिपि है। क्योंकि यह सिर्फ डेल्टा को कॉपी करता है, यह (नॉन-टाइम मशीन) बैकअप, कोड तैनाती और पसंद को संभालने का एक शानदार तरीका है।
डग हैरिस

2

एक सामान्य समाधान नहीं है, लेकिन आप .svn मेटाडेटा फ़ोल्डर के बिना कार्यक्षेत्र की एक प्रति बनाने के लिए svn निर्यात कमांड का उपयोग कर सकते हैं।


आक्रामक होने के लिए नहीं, लेकिन मुझे यकीन नहीं है कि यह जवाब क्यों दिया जा रहा है। मुझे svn की क्षमताओं के बारे में पता है, लेकिन "मैं एक सामान्य समाधान चाहता हूं। मुझे लगता है कि मैं निकट भविष्य में कई प्रकार की फाइलों को बाहर करने की आवश्यकता
पाऊंगा

2
%> mkdir -p FOLDER_OUT && ( tar cf - FOLDER_OR_FILES_IN --exclude=.svn  | tar xvf - -C FOLDER_OUT )

यदि आप चाहें, तो आप 2 टार प्रक्रियाओं के बीच भी 'pv' या ऐसा ही कुछ डाल सकते हैं।


2

एक गंदा लेकिन त्वरित और संक्षिप्त तरीका:

cp -r source destination
find destination -iname .svn |xargs rm -rf

यह एक निर्देशिका को दूसरे (इस प्रकार पुनरावर्ती विकल्प -r) की प्रतिलिपि बनाता है और फिर नामांकित .svn(मामले की अनदेखी) नाम की किसी भी चीज़ को पुन: मिटा देता है ।


1

मैं इसके बारे में एक अलग तरह से जाना जाएगा, टार और उसके बहिष्कृत तंत्र का उपयोग करते हुए।

गंतव्य निर्देशिका से:

tar -X excludefile -C source -f - . | tar xf -

यह स्रोत को cd करेगा, सामग्री को टारगेट करेगा, जो कि बहिष्कृत में सूचीबद्ध है, और फिर इसे मौजूदा निर्देशिका में अनारक्षित करेगा।


सुरुचिपूर्ण समाधान वास्तव में।
निक स्टिनेमेट्स 20

ठीक है, यह वही जवाब है जो मैंने दिया, बस बाद में। इसके अलावा आपको गंतव्य निर्देशिका में होना है ... :)
akira

0

संपादित उत्तर : समस्या यह है कि -Rआपकी प्रतिलिपि को पुनरावर्ती बनाता है और इसलिए आप छिपी हुई फ़ाइलों की प्रतिलिपि बनाते हैं। यहाँ मैं क्या उपयोग होगा:

find source/  -mindepth 1 -not \( -name .svn -prune \) | xargs -Iitem cp item target/

-mindepth 1ध्वज बताता findउच्चस्तरीय निर्देशिका की अनदेखी करने के। चूँकि आप उस निर्देशिका की सभी सामग्री को एक नए टॉपलेवल निर्देशिका में कॉपी करना चाहते हैं, इसलिए मुझे लगता है कि आप ऐसा नहीं चाहते हैं।

जैसा कि क्रिस नवा कहते हैं , उनके जवाब में पहले से ही एक अंतर्निहित तरीका है अगर हम SVN फ़ोल्डर के बारे में बात कर रहे हैं, लेकिन जब से आपने अधिक सामान्य समाधान के लिए कहा है, तो यह थोड़ा मदद कर सकता है।


धन्यवाद Telemachus, यह उपयोगी है। मेरे पास समालोचना करने का अनुभव नहीं है, लेकिन मैं अपनी मूल पोस्ट के बाद से जो कुछ भी कहा गया हूं उसे दोहराऊंगा। "xargs टूट गया है" अज्ञात irc टिप्पणीकार ने मुझे बताया कि मुझे थोड़ा और चारों ओर देखने के लिए प्रेरित किया और मुझे लगता है कि डग हैरिस का जवाब समस्या को संबोधित करता है। Xargs को अशक्त वर्णों का उपयोग करने के लिए कहें। मुझे लगता है कि -0 स्विच है?
माइकल प्रेस्कॉट

@ मिसेल: xargsटूटा नहीं है, लेकिन यूनिक्स जैसी प्रणालियों पर, डिफ़ॉल्ट उन में रिक्त स्थान के साथ फ़ाइल नाम (या निर्देशिका नाम) का उपयोग नहीं है। यदि आपके फ़ाइलनाम (या निर्देशिका नामों) में स्थान या "मज़ेदार" अक्षर हैं, तो आपको उससे निपटने के लिए अतिरिक्त काम करना होगा। (में जीएनयू find, वहाँ में एक पूरी अनुभाग है manपृष्ठ इस समस्या के कारण 'असामान्य FILENAMES "कहा जाता है।) -0में झंडा xargsऔर -print0के लिए findइन समस्याओं को संभालने के लिए मदद करते हैं। हालांकि, मैं आपसे वादा करता हूं कि आप -Rअपनी कॉपी कमांड में उपयोग नहीं करना चाहते हैं । यह SVN निर्देशिकाओं से बचने के लिए आप जो कुछ भी करेंगे उसे पूर्ववत करेंगे।
टेलीमेकस

0

मुझे लगता है कि यह निर्भर करता है कि आपका पेड़ कितना बड़ा है, लेकिन सिर्फ पहले ही सब कुछ कॉपी क्यों न करें , उसके बाद .svan फ़ोल्डरों को ट्रिम करें:

find /dest-dir -type d -name .svn -exec rm -rf {} \;

?


किसी भी बेंचमार्किंग के बिना, मेरा प्रारंभिक विचार यह है कि यह सीपीयू चक्रों का दोहरा कचरा है: नकल और हटाना। सही findकमांड को तैयार करने में थोड़ा अतिरिक्त समय लग सकता है , लेकिन आप केवल एक बार ही ऐसा करते हैं। एक बार सही होने के बाद आप सैकड़ों बार कमांड का उपयोग कर सकते हैं।
टेलीमेकस

@Telemachus - सच है, लेकिन यह है कि कंप्यूटर (माना जाता है) में अच्छे हैं - मुश्किल सामान तो हम नहीं है! वास्तव में - कुछ फ़ाइलों को कॉपी करने में क्या नुकसान है केवल उन्हें जल्द ही हटा दिया जाना चाहिए, अगर इसका मतलब है कि आपके द्वारा इसे करने के लिए आविष्कृत कमांड बहुत सरल हैं?
स्टीव फोली

@ सच: कोई नुकसान नहीं है, वास्तव में। जहां तक ​​यह जाता है, यह एक अच्छा समाधान है। यह एक सिद्धांत का अनुसरण करता है जो मुझे पसंद है: "सबसे सरल काम करो जो संभव है।" दूसरी ओर, यह एक और सिद्धांत का उल्लंघन करता है जिसे मैं और भी पसंद करता हूं: "अपने उपकरण सीखें।" मैं findखुद को बेहतर तरीके से उपयोग करना सीखना चाहूंगा , ताकि मुझे ऐसा करने की जरूरत न पड़े। लेकिन आप सही हैं: इस समाधान के साथ वास्तव में कुछ भी गलत नहीं है।
टेलीमेकस

@Telemachus: मैं "अपने उपकरण जानें" से सहमत हूं। जब मैंने शुरुआत की, तो मुझे यकीन है कि ऊपर की मेरी कमान मेरे लिए बहुत ही गूढ़ होगी, तब :-)
स्टीव फोली


0

आप इसके विपरीत भी कर सकते हैं। नीचे दिए गए कमांड का उपयोग करके सब कुछ कॉपी करें .svn फ़ोल्डर हटाएं:

find . | grep ".svn" | xargs rm -rf
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.