केवल एक निर्देशिका से दूसरे निर्देशिका में नियमित फ़ाइलों की प्रतिलिपि बनाएँ


12

मैं निर्देशिका 1 से निर्देशिका 2 की सामग्री को कॉपी करना चाहूंगा। हालाँकि, मैं अपनी निर्देशिका से केवल फ़ाइलों (और निर्देशिकाओं) को कॉपी करना चाहूंगा। मैं यह कैसे कर सकता हूं?

cp dir1/* dir2/*

तो मैं अभी भी निर्देशिका मुद्दा है।

इसके अलावा, मेरी सभी फाइलों का कोई एक्सटेंशन नहीं है, इसलिए चाल नहीं चलेगा


1
पता नहीं है कि एक्सटेंशन का इससे क्या लेना-देना है।
ctrl-alt-delor-Novor 20'13

1
cp dir1/* dir2याcp -t dir2 dir1/*
ctrl-alt-delor-delor

@richard निर्देशिकाओं के लिए एक्सटेंशन का उपयोग नहीं करने की DOS दुनिया से आने वाली एक बहुत ही सामान्य आदत है, जो अभी भी कुछ हद तक जीवित है, कुछ लोगों को यह मानने के लिए अग्रणी है कि अगर कोई डॉट है तो यह एक निर्देशिका नहीं है और इसके विपरीत।
गाइल्स का SO- बुराई पर रोक '22

ठीक है, लेकिन अभी भी नहीं relevent।
ctrl-alt-delor-

जवाबों:


18
cp dir1/* dir2

cpजब तक स्पष्ट रूप से ऐसा करने के लिए नहीं कहा जाता है, तब तक निर्देशिकाओं की नकल नहीं करेंगे ( --recursiveउदाहरण के लिए, देखें man cp)।

नोट 1: cp गैर-शून्य स्थिति के साथ सबसे अधिक संभावना बाहर निकल जाएगी, लेकिन फ़ाइलों को वैसे भी कॉपी किया गया होगा। यह एक मुद्दा जब बाहर निकलने के कोड के आधार पर आदेशों चेनिंग हो सकता है: &&, ||, if cp -r dir1/* dir2; then ..., आदि (के लिए धन्यवाद contrebis के लिए कि इस मुद्दे पर अपनी टिप्पणी )

नोट 2 : cpअंतिम पैरामीटर को एकल फ़ाइल नाम या निर्देशिका की अपेक्षा करता है। *लक्ष्य निर्देशिका के नाम के बाद वास्तव में कोई वाइल्डकार्ड नहीं होना चाहिए । dir2\*खोल की तरह ही विस्तार किया जाएगा dir1\*। अप्रत्याशित चीजें होंगी :

  • यदि dir2खाली है और आपके शेल और सेटिंग्स पर निर्भर करता है:
    • आपको बस एक त्रुटि संदेश मिल सकता है, जो सबसे अच्छा मामला है।
    • dir2/*वस्तुतः लिया जाएगा (एक फ़ाइल / निर्देशिका नाम की तलाश में *), जो संभवतः एक त्रुटि का कारण होगा, जब तक कि *वास्तव में मौजूद न हो।
    • dir2/*यह केवल पूरी तरह से कमांड से हटा दिया जाएगा, छोड़कर cp dir1/*। विस्तार के आधार पर, जो dir1/*डेटा को नष्ट भी कर सकता है:
      • यदि dir1/*केवल एक फ़ाइल या निर्देशिका से मेल खाता है, तो आपको एक त्रुटि मिलेगी cp
      • यदि dir1/*ठीक दो फाइलों से मेल खाता है, तो एक को दूसरे ( बैड ) द्वारा ओवरराइट किया जाएगा ।
      • यदि dir/*कई फ़ाइलों से मेल खाता है और अंतिम मैच एक है, तो आपको एक त्रुटि संदेश मिलेगा।
      • यदि अंतिम मैच dir/*एक निर्देशिका है तो अन्य सभी मैचों को इसमें स्थानांतरित कर दिया जाएगा।
  • यदि dir2खाली नहीं है, तो यह फिर से निर्भर करता है:
    • यदि अंतिम मैच dir2/*एक निर्देशिका है, dir1/*और अन्य मैचों को dir2/*स्थानांतरित कर दिया जाएगा।
    • यदि dir2/*फ़ाइल का अंतिम मिलान है, तो आपको संभवतः एक त्रुटि संदेश मिलेगा, जब तक कि dir1/* केवल एक फ़ाइल से मेल नहीं खाता।

$ cp dir1/* dir2-> cp: dir1/isadir is a directory (not copied).मेरे लिए स्टेटस 1 से बाहर निकलता है।
कंट्रेबिस

1
हाँ, यह मेरे लिए भी स्थिति 1 से बाहर निकलता है। लेकिन फिर भी, मेरे द्वारा जांची गई प्रत्येक प्रणाली पर cpमेल खाने वाली फ़ाइलों की प्रतिलिपि बनाता dir1/*है: आर्क लिनक्स, उबंटू 14.04, ओपनबीएसडी 3.9 और 5.5, एसयूएसई लिनक्स 8.1, फ्रीबीएसडी 6.2, सोलारिस 8, 9 और 10 (जहां cpवास्तव में कोड 2 के साथ बाहर निकलता है)। इसलिए यह व्यवहार न तो नया है (SuSE 8.1 2002 से है) और न ही यह लिनक्स तक सीमित है। cpएक गैर-शून्य निकास कोड के साथ बाहर निकलता है क्योंकि यह वह सब कुछ नहीं कर सकता जो इसे करने के लिए कहा गया था। इसका मतलब यह नहीं है कि यह कुछ भी नहीं करता है ।
Adaephon

3
ज़रूर, मुझे लगता है कि ध्यान देने योग्य है क्योंकि अगर आप एक साथ कमांड का पीछा कर रहे हैं तो &&यह समस्या पैदा कर सकता है। मैं इस तरह से कुछ करने की कोशिश कर रहा था, हालांकि मुझे अब संदर्भ याद नहीं है।
कंट्रेबिस

यह छिपी हुई फाइलों की नकल नहीं करता है।
felwithe

@felwithe चाहे *छुपी हुई फ़ाइलें शामिल हों या छिपी हुई फ़ाइलों को कैसे शामिल किया जाए, यह शेल पर निर्भर करता है। यदि *छिपी हुई फ़ाइलें शामिल नहीं हैं, तो आप उनके साथ मेल कर सकते हैं .*। ध्यान दें कि यह शामिल होंगे .और ..पर bashऔर dashनहीं बल्कि पर zsh। इस उत्तर के संदर्भ में आप दूर हो सकते हैं cp dir1/* dir1/.* dir2क्योंकि .और ..निर्देशिकाएं हैं और उनकी नकल नहीं की जाएगी। zshछिपी हुई फ़ाइलों को शामिल करने के लिए भी बनाया जा सकता है *(D)
Adaephon

7

यह शेल है जो वाइल्डकार्ड का विस्तार करता है, न कि आज्ञाओं का। इसलिए cp dir1/* dir2/*पहले दो वाइल्डकार्ड का विस्तार करें, फिर cpपरिणाम पर कॉल करें। यह बिल्कुल नहीं है जो आप स्पष्ट रूप से उम्मीद करते हैं: इस बात पर निर्भर करता है कि पहले से कितनी फाइलें हैं dir2, dir2/*एक या अधिक तर्क तक विस्तारित हो सकती हैं। कमांड को cpयह नहीं पता है कि इसके कौन से तर्क पहले पैटर्न के विस्तार से आए थे और कौन से दूसरे पैटर्न के विस्तार से आए थे। यह अपने अंतिम तर्क को गंतव्य निर्देशिका का नाम होने की उम्मीद करता है। इस प्रकार, डायरेक्टरी से डायरेक्टरी dir1में सभी फाइलों को कॉपी करने के लिए dir2, अंतिम तर्क डायरेक्टरी होना चाहिए dir2:

cp dir1/* dir2

चूंकि *सभी फ़ाइलों से मेल खाता है, सभी फ़ाइलों cpको कॉपी करने का प्रयास करता है। इसमें निर्देशिकाएँ शामिल हैं: निर्देशिकाएँ फ़ाइलें भी हैं। यह निर्देशिकाओं को छोड़ देता है, लेकिन एक त्रुटि की रिपोर्ट करता है। यह विशेष फ़ाइलों की सामग्री को कॉपी करता है जैसे नामित पाइप (कुछ उनके लिए बेहतर लिख रहा था, या cpब्लॉक करेगा), आदि।

केवल नियमित फ़ाइलों की प्रतिलिपि बनाने के लिए , आपको मिलान को प्रतिबंधित करना होगा। Zsh में, आप उसके लिए ग्लोब क्वालिफायर का उपयोग कर सकते हैं .:

cp dir1/*(.) dir2

अन्य गोले में यह नहीं है। आप findफ़ाइल प्रकारों को फ़िल्टर करने के लिए कमांड का उपयोग कर सकते हैं । यह मानते हुए कि आप गैर-एम्बेडेड लिनक्स या साइगविन चला रहे हैं:

find dir1 -maxdepth 1 -type f -exec cp -t dir2 {} +

लिनक्स पर, FreeBSD और OSX:

find dir1 -maxdepth 1 -type f | xargs -I {} cp {} dir2

वहाँ निर्दिष्ट करने के लिए एक कारण है -maxdepth 1। इसके अलावा, गंतव्य निर्देशिका में मूल निर्देशिका पदानुक्रम की पुन: प्रतिलिपि बनाने और संरक्षित करने का एक तरीका है?
अब्दुल

@ एबडल विदाउट -maxdepth 1, findकमांड उपनिर्देशिकाओं में पुनर्खरीद करेगा, जो यहां वांछित नहीं था। यदि आप उपनिर्देशिका सहित पूरी निर्देशिका ट्री की प्रतिलिपि बनाना चाहते हैं, तो यह पूरी तरह से अलग प्रश्न है, और इसका उत्तर बहुत सरल है cp -a dir1 dir2:।
गिल्स एसओ- बुराई को रोकें '

0

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

  1. सोर्स फोल्डर पर जाएं फिर कमांड के नीचे लिखें:

    $ cp fileName destination directory path

उदाहरण:

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