'Cp' कमांड का उपयोग करके निर्देशिका सामग्री की प्रतिलिपि बनाएँ


33

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

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

$ cd /home/newuser
$ cp -a /backup/olduser/* .

उपरोक्त समस्या यह है कि ग्लोबिंग पैटर्न '*' छिपी हुई निर्देशिकाओं से मेल खाता है। '' और '..'

आप भी कुछ ऐसा कर सकते हैं:

$ rmdir /home/newuser
$ cp -a /backup/olduser /home/newuser

लेकिन क्या होगा अगर नवागंतुक में पहले से ही कुछ डिफ़ॉल्ट फाइलें और निर्देशिकाएं हों?

केवल मूल 'cp' कमांड और शेल का उपयोग करके एक निर्देशिका की सामग्री को दूसरे में ले जाने के लिए सबसे सरल, सबसे सही, याद रखने में आसान और गड़बड़ न करने वाला तरीका क्या है?

जवाबों:


31

प्रयत्न:

cp -ra /backup/olduser/. /home/newuser

यह बहुत अच्छा है, लेकिन मैं यह पता नहीं लगा सकता कि यह कैसे काम करता है। मुझे लगता है कि यह शायद इसलिए है क्योंकि मुझे समझ में नहीं आता कि कैसे .और ..काम करते हैं। समझाने की परवाह?
ब्रैडली.यर्स

यह मेरे लिए काम किया, लेकिन cp -r ./a bनहीं किया। कोई विचार क्यों?
ब्रिगेडियर

3
मेरे लिए भी काम करता है, लेकिन rविकल्प की जरूरत नहीं है। aविकल्प का अर्थ है r
माउंटेनएक्स

1
-r पैरामीटर इस बिंदु पर थोड़ा बेमानी लगता है!
जश्न का मास्टर

-aपैरामीटर इस स्थिति में मदद करने के लिए कुछ नहीं करता है। कमांड cp -r ./a/. bकंटेंट, और केवल कंटेंट, डायरेक्टरी aमें डायरेक्टरी को कॉपी करेगा b-aझंडा बरकरार रखता लिंक, timestamps आदि, जो प्रश्न के लिए प्रासंगिक नहीं है।
स्टीन स्कुट

23

दो निर्देशिका ए और बी।

दोनों में फाइलें हैं।

आप एक निर्देशिका में हैं जिसमें a और b शामिल हैं।

cp -r ./a b

-r = पुनरावर्ती।


क्या आप सभी फाइल प्राप्त करना चाहते हैं?
bw

7
-A तर्क कुछ भी नहीं है सभी फ़ाइलों के साथ, यह संग्रह के लिए कम है, यह फ़ाइल स्वामित्व, अनुमतियाँ, एक्सेस समय आदि को संरक्षित करेगा। -a तर्क (जबकि अत्यधिक उपयोगी) एक मानक विकल्प नहीं है, और कई cp कार्यान्वयन डॉन 'इसे प्रदान न करें।
Theotherreceive

1
@mch: स्वचालित रूप से शामिल है क्योंकि आप बता दिया है cpएक निर्देशिका कॉपी करने a, और a/.somedotfileके अंतर्गत होता है a। अगर bमौजूद है, इस आदेश की एक सटीक प्रतिलिपि बना देगा aपर b/a
क्वैक क्वोटोटे

2
आसान तरीका:cp -R /some/dir/* /another/dir
n0pe

1
यह b / foo के बजाय a / foo to b / a / foo को
कॉपी करता है

19

याद रखें कि डिफ़ॉल्ट रूप से, cpपहले निर्देशिका को दूसरी निर्देशिका में कॉपी करता है यदि दूसरा मौजूद है।

उदाहरण के लिए निर्देशिका को cp -r a bकॉपी करेगा । यदि मौजूद नहीं है, तो इसे सामग्री के साथ बनाया जाएगा । abba

यदि आप किसी संपूर्ण फ़ाइल सिस्टम को माउंट बिंदु में कॉपी करते समय (उदाहरण के लिए) की सामग्री की प्रतिलिपि बनाना चाहते हैं:ab

cp -r a/. b

पिछले उत्तर की तरह।

कृपया यह भी ध्यान दें कि -a, कुछ अन्य उत्तरों में उपयोग किया जाता है, जैसा ही है -dr --preserve=allऔर टाइमस्टैम्प, संदर्भ और विस्तारित विशेषताओं को संरक्षित करेगा।


कैसे /.काम करता है ?
bradley.ayers 2

a/.निर्देशिका 'a' की सामग्री का प्रतिनिधित्व निर्देशिका के विपरीत ही करती है, ज्यादातर स्थिति में यह समानार्थी है, लेकिन उपयोग करते समय cp -r, यह cp डिफ़ॉल्ट व्यवहार (एक INTO b की नकल) से बचा जाता है।
निकोलस बोनेफॉन

भयानक टिप, यह वही है जो मैं देख रहा था लेकिन कहीं और खोजने में विफल रहा - यह सब 'फू / *' या '-r फू /' जो कोने के मामलों में विफल रहता है।
Tener

@TimoHuovinen '।' एक वाइल्डकार्ड बिल्कुल नहीं है। यह सचमुच "माता-पिता" निर्देशिका है, और '..' दादा-दादी है। इसका अर्थ है '/foo/.///////।' '/ foo' के समान निर्देशिका है, और '/ foo / bar / ..' '/ foo' के समान निर्देशिका है। उन्हें हार्डलिंक के रूप में सोचो जो फाइलसिस्टम के लिए निर्मित हैं।
क्विकमैन

@quuxman धन्यवाद, मैं इसके बारे में वापस तो पता नहीं था। मैं लोगों को भ्रमित करने से बचने के लिए अपनी पुरानी टिप्पणी निकालने जा रहा हूं।
टिमो हुओवेंन

6

जब तक आपने अपने शेल को गंभीरता से समेट नहीं लिया है, ग्लोबिंग पैटर्न '*' मेल नहीं खाता ''। या '..', जैसा कि आप केवल इको * का उपयोग करके सत्यापित कर सकते हैं। इसके बजाय यह क्या करता है फाइलें ओटिट हैं जिनका नाम एक '।' से शुरू होता है, इसलिए आपका दृष्टिकोण सभी छिपी हुई फ़ाइलों को याद करेगा। आप इस व्यवहार को शेल विकल्पों में से कुछ को बदल सकते हैं, उदाहरण के लिए बैश में डॉटग्लोब विकल्प, लेकिन यह तब पोर्टेबल और मजबूत विकल्प नहीं होगा जिसे आप खोज रहे हैं।

यदि आपको इसे एक या दो बार से अधिक करने की आवश्यकता है, तो मेरा सुझाव है कि आप ध्यान से तैयार किए गए स्रोत और लक्ष्य विनिर्देशों के साथ rsync या unison (विशिष्ट आवश्यकताओं के आधार पर) को देखें।

एक अन्य विकल्प यह है कि स्रोत निर्देशिका को एक टारबॉल में रखा जाए और मौजूदा लक्ष्य निर्देशिका पर इसे अनटार किया जाए।


1
मैं इसका उपयोग करता हूं: ( cd /src/dir ; tar cf - . ) | ( cd /dest/dir ; tar xf - )... tar cf - .टार की स्रोत निर्देशिका, dotfiles शामिल है, और इसे STDOUT को थूकता है, जिसे STDIN के लिए पाइप किया जाता है tar xf -
क्वैक क्वोटोटे

मुझे लगता है कि ओपी का पूरा मुद्दा यह है कि फाइलों को कैसे संदर्भित किया जाए जो 'से शुरू होता है।' लेकिन विशेष नहीं । ' और '..' निर्देशिका। Rsync या किसी अन्य जटिल प्रोग्राम का उपयोग करने के बजाय ऊपर कहीं अधिक सुरुचिपूर्ण समाधान है।
क्क्समैन

2

मूल निर्देशिका को छोड़कर, यह सामान्य और छिपी हुई दोनों फ़ाइलों की नकल करेगा ..:

cd /directory/to/copy
cp -r * .[^.]* /destination/directory

यदि आप मूल निर्देशिका को बाहर नहीं करते हैं, तो आप ..अपनी गंतव्य निर्देशिका की सभी सामग्री के साथ समाप्त हो जाते हैं ।


1
लेकिन यह अभी भी उन नामों को शामिल नहीं करता है ..(जैसे,...या..super-hidden) से शुरू होते हैं
स्कॉट

0

डॉट के साथ शुरू होने वाली फ़ाइलों को कॉपी करने के लिए बस cp। * लक्ष्य /

इतना आसान सिर्फ दो बार cp कमांड करना है।

के रूप में पीटर Eisentraut सास सामान्य ग्लोबिंग नियमों में शामिल नहीं हैं .. और। (एचएम, इस वाक्य को कैसे समाप्त करें?)

बस का उपयोग करें -R इसे पुनरावर्ती और -i बनाने के लिए cp पूछें कि क्या आप वास्तव में एक फ़ाइल को अधिलेखित करना चाहते हैं।

cp -ri /backup/olduser/* /newuser/
cp -ri /backup/olduser/.* /newuser/

आमतौर पर *मेल नहीं खाता है .या नहीं .., लेकिन अगर आप उपयोग करते हैं तो यह करता है .*। कोशिश करो echo .*। आप निम्न पैटर्न के साथ .और बाहर कर सकते हैं :। ...[^.]*
21

@ एमच: लेकिन फिर .[^.]*भी उन नामों को शामिल करता है जो (जैसे, या ) से शुरू होते हैं.......super-hidden
स्कॉट

0

यह सभी फाइलों और निर्देशिकाओं को कॉपी करने के लिए काम करता है, जिसमें छुपी हुई निर्देशिकाओं को छोड़कर वर्तमान निर्देशिका से पुनरावर्ती रूप से जहां भी हो:

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