मैं एक फ़ाइल की प्रतिलिपि कैसे बना सकता हूं और उसी समय लक्ष्य निर्देशिका बना सकता हूं?


20

मैं चाहता हूँ cp aaa/deep/sea/blob.psdकरने के लिएbbb/deep/sea/blob.psd

अगर निर्देशिका deepऔर seaनिर्देशिका मौजूद नहीं हैं, तो मैं प्रतिलिपि कैसे बनाऊं bbbताकि प्रतिलिपि दोनों निर्देशिकाओं की आवश्यकता हो और फ़ाइल की प्रतिलिपि बनाएँ?

अभी मैं
No such file or directoryउतना ही गहरा और समुद्र में मौजूद हूं।

मैंने देखा कि वह आदमी पृष्ठों और अन्य सवालों के जवाब देता है, लेकिन मेरे बारे में कुछ नहीं कहता।

निकटतम मुझे rcpनिर्देशिका के लिए उपयोग कर रहा है :

rcp -r aaa/deep/sea/ bbb/deep/sea/

हालांकि यह पूरी निर्देशिका और सामग्री की प्रतिलिपि बनाता है और मैं सिर्फ एक फ़ाइल चाहता हूं। हालांकि ऐसा करने की कोशिश की जा रही हैcp: cannot create regular file bbb/deep/sea/blob.psd' such file or directory

जवाबों:


19

ऐसी स्थिति के लिए अगले फ़ंक्शन का उपयोग करने का प्रयास करें:

copy_wdir() { mkdir -p -- "$(dirname -- "$2")" && cp -- "$1" "$2" ; }

और इसका उपयोग करें

copy_wdir aaa/deep/sea/blob.psd bbb/deep/sea/blob.psd

वैसे, जीएनयू के cpपास एक --parentsविकल्प है। यह वास्तव में आप क्या चाहते हैं के करीब है, लेकिन बिल्कुल नहीं।
यह ऐसी aaaनिर्देशिका भी बनाएगा जो आपको लगता है कि आपको आवश्यकता नहीं है। हालाँकि आप पहले सीडी को aaaकॉपी कर सकते हैं जैसे:

cd aaa && cp --parents deep/sea/blob.psd ../bbb/

24

इसे का उपयोग आसान है installसे कार्यक्रम coreutils कि आम तौर पर की तरह निर्माण सिस्टम के द्वारा यह बहुत ही उद्देश्य के लिए प्रयोग किया जाता है automake :

install -D /path/to/source /path/to/destination

ध्यान दें कि पथ के सभी भागों को वैसा ही installबनाता है, जैसा देखता है । मैं उत्सुक हूं कि आपने ऐसा क्यों शामिल नहीं किया, आप ऐसा क्यों करना चाहते हैं। कॉलिंग और बहुत आसान है।mkdir -pman installmkdircp


2
मुझे लगता है कि इस सवाल पर बहुत अच्छे जवाब हैं, लेकिन यह मेरा वोट है क्योंकि यह सबसे पोर्टेबल है। rsyncइस सवाल का जवाब केवल 1 निर्देशिका बनाने जाएगा, और paxआम हो प्रतीत नहीं होता है।
पैट्रिक

एक मैक के -dबजाय का उपयोग करें -D
मैट एम।

ध्यान दें कि यह कमांड गंतव्य फ़ाइलों को 755( rwxr-xr-x) अनुमतियों के साथ बनाता है , जो शायद वांछित नहीं है। आप -mस्विच के साथ कुछ और निर्दिष्ट कर सकते हैं , लेकिन मुझे फ़ाइल अनुमतियाँ रखने का कोई तरीका नहीं मिला :(
törzsmókus

6

मानक (POSIX / Unix) कमांड के साथ, आपको मिल गया है:

pax -rws ':^:dest/dir/:' file .

1
दिलचस्प। मैंने पहले कभी पैक्स के बारे में नहीं सुना था। हालांकि मुझे इसकी अवधारणा पसंद है। दुर्भाग्य से भले ही यह POSIX में है, ऐसा लगता है कि बहुत कम डिस्ट्रोस इसे डिफ़ॉल्ट रूप से स्थापित करते हैं :-(
पैट्रिक

@ पैट्रिक - अगर आप पोर्टेबिलिटी चिंताओं सेक्शन के info tarआसपास कहीं - के अंत तक सभी रास्ते छोड़ देते हैं - मुझे लगता है कि आप पाएंगे कि जीएनयू पूरी तरह से संगत होने का दावा करता है । मैंने वैसे भी किया था, हालांकि मैं अभी तक उन दावों को एक परीक्षण में लगाने के लिए कभी नहीं मिला। tarpax
माइकस

5

मैं इसका उपयोग करने के तरीके के बारे में नहीं जानता cp, लेकिन इसका उपयोग करना निश्चित रूप से संभव है rsync:

$ rsync sourcefile dir/

जहां dirएक निर्देशिका है जिसका अस्तित्व नहीं है। अन्य आदेशों का उपयोग करके समान प्राप्त करने के कई अन्य तरीके हैं।


3
आपको rsync -R
उत्तराधिकारिणी

@glennjackman वास्तव में, 'उचित' rsyncअधिक विकल्पों के उपयोग की आवश्यकता है, लेकिन सवाल केवल एक गैर-मौजूद लक्ष्य निर्देशिका बनाने के बारे में था, इसलिए मेरा संक्षिप्त उत्तर :)
mjturner

1
कम से कम जीएनयू के cpपास --parentsविकल्प है।
पीपरफ

2
@peterph वास्तव में, लेकिन फिर आप लक्ष्य निर्देशिका के नामकरण में प्रतिबंधित हैं
mjturner

4
cd aaa
pax -rw deep/sea/blob.psd ../bbb

यदि आपके पास नहीं है pax(यह POSIX द्वारा अनिवार्य है, cpio और टार के मानक प्रतिस्थापन के रूप में जिसे मानकीकृत करने के लिए बहुत अधिक असंगतताएं थीं), उपयोग करें cpio -pया tar -cf - … | tar -xf -इसके बजाय।

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