लिनक्स कैसे कॉपी करें लेकिन ओवरराइट न करें?


385

मैं cpएक निर्देशिका करना चाहता हूं, लेकिन मैं किसी भी मौजूदा फाइल को अधिलेखित नहीं करना चाहता, भले ही वे कॉपी की गई फ़ाइलों से अधिक पुरानी हों। और मैं इसे पूरी तरह से निर्बाध रूप से करना चाहता हूं क्योंकि यह एक क्रॉस्टैश बैश स्क्रिप्ट का एक हिस्सा होगा। कोई विचार?


जवाबों:


589

मैन पेज से लिया गया :

-n, --no-clobber
              do not overwrite an existing file (overrides a previous -i option)

उदाहरण:

cp -n myoldfile.txt mycopiedfile.txt

32
ध्यान दें, यह एक त्रुटि के साथ बाहर निकल जाएगा यदि फ़ाइल मौजूद है। सफलता के साथ बाहर निकलने के लिए, प्रयास करें cp -n source.txt destination.txt || true
गैलनड्रूव

13
cp -nअगर फ़ाइल Ubuntu 12.04 पर मौजूद है, तो @galenandrew त्रुटि से बाहर नहीं निकलता है।
अमित

@galenandrew ने पुष्टि की। धन्यवाद। मेरे लक्ष्य में एक रन स्क्रिप्ट जोड़ने के बाद मेरा प्रोजेक्ट Xcode में नहीं बन रहा था।
रूइज

@AaronFranke ऐसा दिखता है जैसे यह करता है।
बोरिस

93

का उपयोग करने पर विचार करें rsync

rsync -a -v --ignore-existing src dst

टिप्पणियों के अनुसार rsync -a -v src dstयह सही नहीं है क्योंकि यह मौजूदा फाइलों को अपडेट करेगा।


7
आप --ignore-existingमौजूदा फ़ाइलों को अधिलेखित होने से रोकने के लिए ध्वज जोड़ना चाहते हैं ।
सभी कार्यकर्ता आवश्यक

7
पूरा कमांड rsync -a -v --ignore-existing <src> <dst>वास्तव में सही उत्तर है, cp -uऊपर के बजाय ।
व्हाइटबर्ड

यदि एक पिछली प्रति बाधित हुई थी और केवल एक छंटनी की गई फ़ाइल की प्रतिलिपि बनाई गई थी, तो मुझे यकीन है कि cp -u इसे पुनः कॉपी नहीं करेगा ... लेकिन rsync, --ignore-मौजूदा के साथ होगा? शायद नहीं भी ... तो यह उन्हें पूरी तरह से समतुल्य बनाता है, है ना?
दिनांक

rsync फ़ाइल को टाइमस्टैम्प रखता है जबकि cp वर्तमान समय का उपयोग करता है (मेरे अनुभव में)
स्टीफन डियाबो

1
कुछ सर्वरों में कोई rsync नहीं है
mebada

51
cp -n

क्या आप चाहते हैं मैन पेज देखें।


@AaronFranke हाँ, यह पुनरावर्ती रूप से काम करेगा।
बोरिस

33

यह RedHat पर काम करेगा:

false | cp -i source destination 2>/dev/null

अद्यतन और अधिलेखित नहीं कुछ अलग है।


4
falseयहाँ क्या करता है?
फ्रोजन फ्लेम

11
@FrozenFlame -iसवालों के जवाब देता है ।
ceving

यदि आप ARG_MAX फ़ाइलों से अधिक कॉपी करने का प्रयास करेंगे, तो जाहिर है, यह कमांड काम नहीं करेगा। इस मामले में काम करने के लिए, इस लिंक को देखें
मेग्निअस

2
यह भी स्पष्ट रूप से, यह कमांड काम नहीं करेगा अगर पृथ्वी सूरज में दुर्घटनाग्रस्त हो जाती है।
ceving

32

ऐसे लोगों के लिए, जिनके पास 'n' विकल्प नहीं है (जैसे कि RedHat पर) आप cp -uकेवल फ़ाइल को लिखने के लिए उपयोग कर सकते हैं यदि स्रोत मौजूदा एक से नया है (या कोई मौजूदा नहीं है)।

[संपादित करें] जैसा कि टिप्पणियों में बताया गया है, यह पुरानी फाइलों को अधिलेखित कर देगा, इसलिए ओपी नहीं चाहता था। उसके लिए छत के उत्तर का उपयोग करें।


11
ओपी ने मौजूदा फ़ाइलों को अधिलेखित न करने के लिए कहा, भले ही वे प्रतिलिपि की गई फ़ाइलों से अधिक पुरानी हों , इसलिए -uवास्तव में उद्देश्य के अनुरूप नहीं है।
एंड्रयू लोट

4
अच्छाई, आप बिल्कुल सही हैं। मुझे आश्चर्य है कि किसी को नोटिस करने में इतना समय लगा।
गंभीर ...

यह वह नहीं हो सकता है जो ओपी ने पूछा था, लेकिन यह वही है जो मुझे अपने Uberspace (Centos 7) के लिए चाहिए था। धन्यवाद!
थॉमस प्रॉक्स

मुझे खुशी है कि छह साल पहले मैं मदद कर सकता था :-D
ग्रिम ...

10

अल्पाइन लाइनक्स: नीचे उत्तर केवल एकल फ़ाइल के मामले के लिए है: अल्पाइन में cp -nकाम नहीं कर रहा है (और false | cp -i ...बहुत) तो मेरे मामले में काम करने वाला समाधान जो मुझे मिला है वह है:

if [ ! -f env.js ]; then cp env.example.js env.js; fi 

उपरोक्त उदाहरण में यदि env.jsफ़ाइल मौजूद नहीं है तो हम इसकी प्रतिलिपि env.example.jsबनाते हैं env.js


1

Cp के कुछ संस्करण में -no-clobber विकल्प नहीं है। उस स्तिथि में:

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