छिपी फ़ाइलों और छिपी निर्देशिकाओं और उनकी सामग्री को शामिल करने के लिए cp के साथ प्रतिलिपि कैसे करें?


392

मैं एक निर्देशिका में बिल्कुल फ़ाइलों और निर्देशिकाओं की cp -rप्रतिलिपि कैसे बना सकता हूं

आवश्यकताएँ:

  • छिपी हुई फ़ाइलों और छिपी निर्देशिकाओं को शामिल करें।
  • ऊपर शामिल करने के लिए एक ध्वज के साथ एक एकल आदेश बनें।
  • पैटर्न से मेल खाते पर भरोसा करने की आवश्यकता नहीं है।

मेरा बदसूरत, लेकिन काम कर रहा है, हैक है:

cp -r /etc/skel/* /home/user
cp -r /etc/skel/.[^.]* /home/user

पैटर्न मिलान के बिना मैं यह सब एक आदेश में कैसे कर सकता हूं? मुझे किस ध्वज का उपयोग करने की आवश्यकता है?


1
यहाँ अधिक उत्तर, हालांकि वे उतने अच्छे नहीं लगते हैं; serverfault.com/questions/3154/…
Roel Van de Paar

कृपया, Eleven81, @bruno pereira द्वारा दिए गए उस स्वीकृत उत्तर को बदलने पर विचार करें, क्योंकि यह एक नया फ़ोल्डर बनाने से बचता है। यदि नहीं, तो इस टिप्पणी को नए पाठकों को अन्य (सबसे अधिक मतदान) उत्तर की जांच करने के लिए एक चेतावनी होने दें। टीएक्स।
डॉ। बीको जूल

जवाबों:


265

फ़ाइलें निर्दिष्ट न करें:

cp -r /etc/skel /home/user

(ध्यान दें कि /home/userपहले से मौजूद नहीं होना चाहिए, अन्यथा यह निर्माण करेगा /home/user/skel।)


61
इसे इसी तरह अगर कुछ उपयोग करना संभव है /home/user/skel करता मौजूद हैं?
ब्रैडली.यर्स

@ bradley.ayers मुझे लगता है कि कोई एक अस्थायी उपनिर्देशिका में कॉपी कर सकता है तो उन्हें ऊपरी स्तर पर ले जाएं (क्योंकि एक ही ड्राइव में चलना तेज है)। आदर्श से कम, लेकिन मेरे लिए अन्य समाधानों की तुलना में कम है।
हालिल Halzgür

7
@ ब्रैडली.यर्स ब्रूनो का जवाब आपके सवाल का जवाब देता है
मार्क

1
यह समाधान मेरे लिए काम नहीं किया। यह छिपी हुई फाइलों की नकल नहीं करता था। मैं CentOS रिलीज 6.5 का उपयोग कर रहा हूं। @ ब्रूनो के समाधान ने किया छलावा।
टेक्नटेक्स

2
उबंटू / डेबियन के तहत यह निर्देशिका को 'स्कल' को लक्ष्य निर्देशिका के अंदर रखता है न कि स्केले के अंदर मौजूद फाइलों को। का प्रयोग करें -T(कोई लक्ष्य) के नीचे प्रति समुचित उपयोग के लिए। ( -rTपुनरावर्ती के लिए)
bshea

468

कहते हैं कि आपने नया फ़ोल्डर बनाया है (या एक बनाने जा रहे हैं) और फ़ोल्डर बनाने के बाद फ़ाइलों की प्रतिलिपि बनाना चाहते हैं

mkdir /home/<new_user>
cp -r /etc/skel/. /home/<new_user>

यह /etc/skelपहली पंक्ति में बनाए गए पहले से मौजूद फ़ोल्डर में से सभी फ़ाइलों / फ़ोल्डर की पुनरावृत्ति करेगा ।


5
अगर मुझे यह गलत नहीं लगा, तो यह छुपी हुई / डॉट फाइलों की नकल नहीं हुई।
हालील Halzgür

34
मेरे लिए अच्छा काम करता है। ध्यान दें कि '।' यह काम करने के लिए महत्वपूर्ण है।
मार्क

12
यह काम करता है, लेकिन, क्यों? मैनुअल में इसका संदर्भ नहीं मिल सकता है।
जूलियन पालार्ड

5
मुझे लगता है कि यह काम करता है क्योंकि आम तौर पर, यह पहले तर्क में अंतिम फ़ोल्डर के नाम के साथ एक नया फ़ोल्डर बनाएगा। हालाँकि, चूंकि यह नाम है ., इस व्यवहार के लिए इसे पहले से मौजूद निर्देशिका बनाने की आवश्यकता होगी, इसलिए यह केवल उस चरण को छोड़ देता है।
20

28
@Technext bash में डिफ़ॉल्ट ग्लोबिंग में फ़ाइल नाम के साथ शुरू होने वाले फ़ाइल नाम शामिल नहीं हैं ., यह बदलने के लिए कि आपको shopt -s dotglobउन फ़ाइलों को शामिल करने में सक्षम होने से पहले कमांड का उपयोग करने की आवश्यकता है । इसलिए *, डिफ़ॉल्ट रूप से, आप इस निर्देशिका से पुनरावर्ती रूप से सभी फ़ाइलों को कॉपी करने के लिए कह रहे हैं *जिनका उपयोग करके विस्तार किया जा सकता है (जिसमें डिफ़ॉल्ट रूप से छिपी हुई फ़ाइलें शामिल नहीं हैं)। जबकि दूसरे छोर पर .आप "इस निर्देशिका" से सब कुछ कॉपी करने के लिए cp का उपयोग कर रहे हैं।
ब्रूनो परेरा

79

ऐसा करने का सही साधन -T (--no-target-directory)विकल्प का उपयोग करना है, और फ़ोल्डरों की पुनरावृत्ति करना (स्लैशिंग, तारांकन आदि के बिना), अर्थात:

cp -rT /etc/skel /home/user

इस की सामग्री की प्रतिलिपि जाएगा /etc/skelकरने के लिए /home/user(छिपा फ़ाइलों सहित), फ़ोल्डर बनाने /home/userअगर यह मौजूद नहीं है; हालाँकि -Tविकल्प /etc/skelनए फ़ोल्डर में कॉपी होने की सामग्री /home/user/skelको फ़ोल्डर में /home/userमौजूद होने से रोकता है।


3
सही उत्तर। +1
bshea

यह वास्तव में सही उत्तर था
गायन

यह गुच्छा का सबसे अच्छा जवाब है; इसका केवल एक ही है जो समस्या को जटिल किए बिना हल करता है
ZaxLofful

वास्तव में अपेक्षित के रूप में कॉपी करने के लिए काम करता है
चेतबाहन

जब आप एक मामले के लिए सही cmd ध्वज का उपयोग करते हैं तो इसे प्यार करें।
ट्रान्स ट्रेट

66

bashअपने आप में एक अच्छा समाधान है, यह एक है shell option, आप कर सकते हैं cp, mvऔर इसी तरह।

shopt -s dotglob # for considering dot files (turn on dot files)

तथा

shopt -u dotglob # for don't considering dot files (turn off dot files)

उपरोक्त समाधान मानक है bash

ध्यान दें:

shopt # without argument show status of all shell options
-u # abbrivation of unset 
-s # abbrivation of set

2
यह उपयोगी है जब आप गंतव्य के अंदर नई निर्देशिका बनाए बिना केवल सामग्री की प्रतिलिपि बनाना चाहते हैं। खासतौर पर तब जब डेस्ट पाइंट माउंट पॉइंट हो।
kaszynek

3
यह वास्तव में सबसे अच्छा जवाब है और सवाल के दिल में
स्टीफन

7
यह setoptzsh के लिए है, अगर कोई और सोच रहा है।
पैट

25

Rsync का उपयोग करें:

rsync -rtv source_folder/ destination_folder/


मेरे लिए सबसे अच्छा विकल्प, हालांकि मैं पूरी प्रक्रिया पर अधिक प्रतिक्रिया देने के लिए --progress का उपयोग करता हूं।
13

5

rsync अच्छा है, लेकिन एक और विकल्प:

cp -a src/ dst/

मुख्य मदद से:

   -a, --archive
          same as -dR --preserve=all

   -d     same as --no-dereference --preserve=links

   -R, -r, --recursive
          copy directories recursively

मैं हमेशा cp -r का उपयोग करता था। Cp -a का उल्लेख करने के लिए धन्यवाद
पिनाकी मुखर्जी

4

यदि आपके स्रोत और लक्ष्य निर्देशिका का एक ही नाम है, भले ही लक्ष्य निर्देशिका मौजूद हो, आप बस टाइप कर सकते हैं:

cp -R /etc/skel /home/

यह छिपी हुई फाइलों और निर्देशिकाओं सहित / etc / skel निर्देशिका को / home / में कॉपी करेगा।

आखिरकार, आप निर्देशिका को कॉपी कर सकते हैं और एक ही पंक्ति में उसका नाम बदल सकते हैं:

cp -R /etc/skel /home/ && mv /home/skel /home/user

या आप बस cp -r /etc/skel /home/userनाम बदलने के skelलिए उपयोग कर सकते हैं user...
डेविड

यह सही है, केवल अगर / घर / उपयोगकर्ता अभी तक मौजूद नहीं है।
गेब्रियल हाटक्लोक्क

4

आप rsync का उपयोग कर सकते हैं।

rsync -aP ./from/dir/ /some/other/directory/

आप ssh पर कॉपी भी कर सकते हैं

rsync -aP ./from/dir/ username@remotehost:/some/other/directory/

आपके द्वारा उपयोग किए जा सकने वाले विभिन्न झंडे हैं: -a, --archive # संग्रह (-rlptgoD)

-r, --recursive
-l, --links      # copy symlinks as links
-p, --perms      # preserve permissions
-t, --times      # preserve times
-g, --group      # preserve group
-o, --owner      # preserve owner
-D               # --devices --specials

--delete         # Delete extra files

You may want to add the -P option to your command.

--partial        # By default, rsync will delete any partially transferred file if the transfer is interrupted. In some circumstances it is more desirable to keep partially transferred files. Using the --partial option tells rsync to keep the partial file which should make a subsequent transfer of the rest of the file much faster.

-P               # The -P option is equivalent to --partial --progress.   Its  purpose  is to make it much easier to specify these two options for a long transfer that may be interrupted.

रुपी मैन पेज


4

सबसे सरल तरीका है:

cp -r /etc/skel/{.,}* /home/user

अभिव्यक्ति {.,}*में सभी फाइलें और निर्देशिकाएं शामिल हैं (एक डॉट के साथ शुरू)।

यदि आप अभिव्यक्ति के ऊपर उपयोग नहीं करना चाहते हैं, तो आप cpसंपत्ति का उपयोग कर सकते हैं, जो एक लक्ष्य फ़ोल्डर के लिए कई स्रोतों को निर्दिष्ट करने की क्षमता है:

cp -r /etc/skel/* /etc/skel/.* /home/user

1
यह फ़ाइलों को याद करेगा जैसे ..anythingया ...anythingआदि - stackoverflow.com/a/31438355/2351568 में इस समस्या के लिए सही rexx शामिल है। || लेकिन वैसे भी उपयोग shopt -s dotglobअभी भी बेहतर समाधान है!
डीजे क्रशदम्मी

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

क्षमा करें गलत पाठ! - आपके उत्तर के साथ समस्या यह है कि यह भी विचार करेगा .और ..(जो वर्तमान और इसके फ़ोल्डर के समतुल्य है)। || लेकिन फिर भी लिंक में उत्तर इसे आगे बताता है और एक समाधान प्रदान करता है।
डीजे क्रशडम्मी

2

ध्यान दें कि एक कमांड-लाइन ट्रिक है (कम से कम, sh , bash , और ksh में काम करता है ): बस एक स्लैश के साथ डायरेक्ट्री से प्रत्यय है । इस की सामग्री को डालना होगा से में निर्देशिका के लिए निर्देशिका (विडंबना यह है कि, मैं पहली बार इस चाल के बारे में जब सीखा था का उपयोग कर rsync )।

उदाहरण:

/tmp$ mkdir test_dir1
/tmp$ cd test_dir1/
/tmp/test_dir1$ touch aa
/tmp/test_dir1$ touch .bb
/tmp/test_dir1$ cd ..
/tmp$ mkdir test_dir2

/tmp$ cp -r test_dir1/* test_dir2
/tmp$ ls -1a test_dir2
.
..
aa

/tmp$ cp -r test_dir1/ test_dir2
/tmp$ ls -1a test_dir2
.
..
.bb
aa

2

मैं उसी समस्या के समाधान के लिए गुग्लड आया था, तब मुझे महसूस हुआ कि इसे ढूंढना आसान है। यह लाभ शेल पर निर्भर नहीं करता है, या विशेष उपयोगिताओं को स्थापित नहीं किया जा सकता है।

find /etc/skel/ -mindepth 1 -exec cp -r {} /home/username/ \;

मैं पीछे हटने के साथ चाल की कोशिश की, लेकिन वह मेरे लिए काम नहीं किया।


2

इस समस्या के लिए मेरा समाधान जब मुझे सभी फाइलों ( .फाइलों सहित ) को एक लक्ष्य निर्देशिका में कॉपी करना है, तो अनुमतियों को बनाए रखना है: (ओवरराइट पहले से मौजूद है तो)

yes | cp -rvp /source/directory /destination/directory/

yesस्वचालित रूप से गंतव्य फ़ाइलों को अधिलेखित करने के लिए है, rपुनरावर्ती, vक्रिया, pअनुमतियाँ बनाए रखें।

ध्यान दें कि स्रोत पथ एक के साथ समाप्त नहीं हो रहा है/ (इसलिए सभी फ़ाइलें / निर्देशिका और फ़ाइलें कॉपी की गई हैं)

गंतव्य निर्देशिका समाप्त होती है/ क्योंकि हम स्रोत फ़ोल्डर की सामग्री को गंतव्य के रूप में संपूर्ण रूप से दे रहे हैं।


1

मैंने देखा है कि cp हमेशा छिपी हुई फ़ाइलों की प्रतिलिपि नहीं बनाता है और यदि आप एक ऐसी कमांड चाहेंगे जो सभी linux / unix बोलियों में काम करे, तो आपको उपयोग करने की कोशिश करनी चाहिए:

cd /etc/skel
find | cpio -pdumv /home/user

-2

कम से कम K3b 2.0.3 के रूप में, एक प्रश्न बॉक्स है जो पॉप अप करने के लिए जब परियोजना में जोड़ा जाता है, तो पूछें कि क्या आप छिपी हुई फ़ाइलों को शामिल करना चाहते हैं ... एक सवाल यह भी है कि पॉप-अप के बारे में पूछने के लिए लिंक। अच्छी सामग्री!


"एक प्रश्न बॉक्स जो पॉप अप होता है" - एक शेल (सीएलआई) कमांड के लिए?
स्कॉट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.