वर्तमान निर्देशिका की सामग्री को एक उपनिर्देशिका में कॉपी करना


13

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


क्या आपका मतलब कॉपी या मूव से है?
क्रेग

जवाबों:


12

यदि आप फ़ोल्डर की सामग्री को पुनरावर्ती रूप से कॉपी करना चाहते हैं (1 त्रुटि फेंक देंगे, तो नीचे दिए गए विकल्प):

cp -r * sub/

थोड़ा अधिक हैकी, लेकिन गैर-खाली उपनिर्देशिकाओं पर काम करता है:

TARGETDIR='targetdir here';cp -r `find . -maxdepth 1 ! -name "$TARGETDIR"` "$TARGETDIR"

एक और ऑनलाइनर:

TARGETDIR='targetdir here';for file in *;do test "$file" != "$TARGETDIR" && cp "$file" "$TARGETDIR/";done

या पुनरावर्ती:

TARGETDIR='z';for file in *;do test "$file" != "$TARGETDIR" && cp -r "$file" "$TARGETDIR/";done

यह तब तक काम नहीं करता है जब तक उप / खाली नहीं है -> उप को फिर से उप में कॉपी किया जाएगा, जब तक कि @Oguz नहीं चाहता था।

ठीक है मैं अंत में findकोड से संतुष्ट हूं : D
Lekensteyn 17

2
आपका दूसरा आदेश उन फ़ाइलनामों के लिए विफल रहता है जिनमें रिक्त स्थान शामिल हैं। का प्रयोग करें xargsया -exec। कोई ज़रूरत नहीं है grep- उपयोग ! -name "$TARGETDIR"या समान। आपके पास बेजोड़ उद्धरण हैं $file। मुझे नहीं लगता कि एक पुनरावर्ती cpआपके किसी भी कार्य को पूरा करने के तरीके पर काम करेगा।
अगली सूचना तक रोक दिया गया।

Woha, पिछले कोड में एक उद्धरण याद किया। अच्छी टिप्पणी डेनिस, मैंने इस मामले में -name का उपयोग करने के बारे में कभी नहीं सोचा था :)
Lekensteyn

4

targetयदि आपका लक्ष्य बैश है तो मान लेना लक्ष्य उपनिर्देशिका का नाम है:

shopt -s extglob
cp -r !(target) target/

Ksh में, आप सीधे कर सकते हैं cp -r !(target) target/

Zsh में, आप setopt ksh_globतब कर सकते हैं cp -r !(target) target/। एक और संभावना setopt extended_globतब है cp -r ^target target/


2

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

यदि फ़ाइलनाम में स्थान हैं, तो ऊपर पोस्ट किए गए अधिकांश समाधान काम नहीं करेंगे। मैं सुझाव के वेरिएंट का उपयोग करने का सुझाव देता हूं -print0 | xargs -0, या खोज -exec, आदि।


0

क्या यह आपके लिए काम करेगा?

cp -r * subdir/

यदि आप वर्तमान dir में सब कुछ एक उपनिर्देशिका में कॉपी करने के बजाय स्थानांतरित करना चाहते हैं, तो आप यह कर सकते हैं:

mv * subdir/

यह गैर-खाली निर्देशिका का ध्यान नहीं रखता है

मैंने सिर्फ परीक्षण किया, और यह काम किया।
कार्लफिलिप

आपको सुझाए गए @Lekensteyn की तरह गैर-रिक्त निर्देशिका की प्रतिलिपि बनाने की आवश्यकता है।

-1

यह सब कुछ कॉपी करेगा, जिसमें डॉट फाइल्स भी शामिल हैं, न कि टारगेट डायरेक्टरी को ही, टारगेट डायरेक्टरी को शामिल करने के लिए SUBDIR:

for i in `ls -a | grep -Ev '^(SUBDIR|\.\.?)$'`; do cp $i SUBDIR; done

2
फ़ाइल नाम के लिए रिक्त स्थान शामिल हैं।
अगली सूचना तक रोक दिया गया।

-1

यह कहता है फ़ाइल dirCopy.sh में जाती है



for i in `ls`
do
        if [ $i != "subDir" ]
        then
                `cp -r $i subDir`
        fi
done

अपने कंसोल में इसे "sh dirCopy.sh" के रूप में चलाएं


2
कोई के लिए की जरूरत है ls: for file in *। Backticks के लिए कोई ज़रूरत नहीं है - उपयोग $()। कमांड के $()चारों ओर बैकटिक्स (या ) की कोई आवश्यकता नहीं है cp(जो एक त्रुटि संदेश देगा)।
अगली सूचना तक रोक दिया गया।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.