सब फ़ोल्डर में सभी फ़ाइलों को सबफ़ोल्डर में कैसे स्थानांतरित करें?


69

मैं रास्ते में हूँ:

/myuser/downloads/

और मैं एक उप फ़ोल्डर बनाएँ:

/myuser/downloads/new

अब मैं डाउनलोड फ़ोल्डर में सभी फ़ाइलों और फ़ोल्डरों / उप-फ़ोल्डरों को उप-फ़ोल्डर में स्थानांतरित करना चाहता हूं।

मैं यह कैसे कर सकता हूँ?

मैंने कोशिश की:

mv -R *.* new/

लेकिन कदम -R स्विच नहीं लगता है।


4
आपको -R की जरूरत नहीं है। बस mv * newहालांकि, यह "नया करने के लिए नए कदम नहीं कर सकते" या कुछ इसी तरह होगा। शायद mv -i * newआप ओवरराइट को रोकते हैं।

जवाबों:


100

आदेश

mv !(new) new

चाल चलनी चाहिए। यदि यह काम नहीं करता है, तो shopt -s extglobपहले चलाएं ।

छिपी हुई फ़ाइलों / निर्देशिकाओं को स्थानांतरित करने के लिए (जो कि डॉट के साथ शुरुआत होती है), shopt -s dotglobपहले भी चलाएं ।
इसलिए योग करने के लिए:

shopt -s extglob dotglob
mv !(new) new
shopt -u dotglob

( dotglobबुरे आश्चर्य से बचने के लिए हमेशा परेशान रहना बेहतर है )।


5
क्या आप बता सकते हैं कि इसका महत्व क्या है !(something)?
Adeerlike

2
@adeer जो सिर्फ (कुछ) नहीं कह रहा है। दूसरे शब्दों में, सब कुछ कॉपी करें लेकिन कुछ नहीं। कीचड़ की तरह साफ़?
रॉकीमाउंट हाई

4
बहुत। क्या तुम zsh के लिए बराबर पता है?
Adeerlike

1
मुझे यह नहीं मिलता है, उदाहरण के लिए यदि मैं फ़ोल्डर की सामग्री devको अपने वर्तमान स्थान पर स्थानांतरित करने का प्रयास करता हूं, तो क्या मुझे निष्पादित करना होगा mv !(dev) dev?? मुझे मिलता है-bash: !: event not found
ब्लैक

5
@adeer बहुत समान। setopt extendedglobविस्तारित ग्लोब मोड को zsh में सेट करने के लिए। ^बहिष्कार प्रतीक है, तो mv ^new newचाल करना होगा। फिर zsh में सेट किए गए सभी विकल्पों को देखने के लिए setoptऔर विस्तारित ग्लोब मोड को अक्षम करने के लिए आप कर सकते हैंunsetopt extendedglob
श्री टी।

10

मुझे ऐसा कुछ मिला, लेकिन यह समझना थोड़ा सरल है, और यह आपके लिए भी अच्छा काम कर सकता है:

ls | grep -v new | xargs mv -t new

उपरोक्त समाधान के लिए एक स्पष्टीकरण जोड़ना:

मैन पेज से:

  • mv -t

    -t, --target-directory=DIRECTORY
          move all SOURCE arguments into DIRECTORY
    
  • grep -v

    -v, --invert-match
          Invert the sense of matching, to select non-matching lines.
    

कदम से समझाया:

  • ls वर्तमान निर्देशिका में फ़ाइलों को सूचीबद्ध करेगा
  • grep -v new वापस लौटा जाएगा जो नया नहीं है
  • xargs mv -t newइसके द्वारा पाइप की गई फ़ाइलों grep -vको लक्ष्य निर्देशिका में ले जाएगा

मैं इस विधि की कोशिश की, लेकिन मैं कर रहा हूँ mv: illegal option -- t:। क्या यह इसलिए है क्योंकि मैं उपयोग कर रहा हूं zsh?
कॉन्स्टेंटफुन

@ConstantFun यह zsh हो सकता है लेकिन मुझे लगता है कि यह आपका कार्यान्वयन है mv, (अर्थात आपके mv के संस्करण उनके द्वारा उपयोग किए जा रहे अलग हैं) आप किस ओएस का उपयोग कर रहे हैं? मुझे विश्वास है कि जब मैंने यह उत्तर लिखा था तो मैं linux distro centosका उपयोग कर रहा था bash
lockwobr

2
बस इसे ओएक्सएक्स पर परीक्षण करना और मुझे वही त्रुटि मिलती mv: illegal option -- tहै, क्योंकि ऑक्स के एमवी में कोई -tविकल्प नहीं है ।
lockwobr

1
(मैंने इसकी कोशिश नहीं की है, और इस पर योजना नहीं है।) यह लिंक Apple.stackexchange.com/questions/69223/… आपको बताता है कि gnucore कैसे स्थापित करें, जो आपको gnu core cli utils, bsd के साथ osx जहाज प्राप्त करने में मदद करना चाहिए cli tools जो अलग हैं जो linux के साथ आते हैं।
तालाबंदी

मैं OSX पर चल रहा हूँ zsh, तो यह शायद OS तो है ..? स्पष्टीकरण देने के लिए धन्यवाद!
कांस्टेंटफुन

7

सरल विचार। मान लें कि आप / myuser में हैं , तो नए नाम डाउनलोड करें , एक नई डाउनलोड निर्देशिका बनाएं और फिर उसमें नया स्थानांतरित करें ।

mv downloads new # downloads is now called new
mkdir downloads # create new directory downloads
mv new downloads # move new into it.

1

यदि आप किसी फ़ोल्डर से उसके सबफ़ोल्डरों में से सभी फ़ाइलों को स्थानांतरित करना चाहते हैं, तो आप निम्न कमांड का उपयोग कर सकते हैं:

find /myuser/downloads/ -type d -name 'new' -prune -type f | xargs mv -t /myuser/downloads/new

यह सभी फाइलों को खोजेगा और फिर उन्हें आपके सबफ़ोल्डर में ले जाएगा।

@waltinator: के -type d -name 'new' -pruneट्रैवर्सल को रोकने के लिए जोड़ा गया है /myuser/downloads/new


मैं नाम वाली उप-बनाया newऔर इस आदेश की कोशिश की, मैं mv: missing file operandऔरTry 'mv --help' for more information
mook765

1

आप इस वैकल्पिक प्रक्रिया की कोशिश कर सकते हैं — पथ में बने रहें

/myuser/downloads/

लेकिन, पहले /myuser/downloads/new/डायरेक्टरी बनाने के बजाय, डायरेक्टरी में फोल्डर बनाएं /myuser/, कमांड के साथ mkdir ../new, फिर सभी फाइलों को इन downloadsपर ले जाएँ new, और अंत newमें इन करें downloads। आप इसे एक पंक्ति में कर सकते हैं, जबकि /myuser/downloads/मार्ग में, कमांड के साथ:

mkdir ../new && mv * ../new && mv ../new ../downloads

इस मामले में, आप, के बाद से फ़ाइलें / फ़ोल्डर के "फ़िल्टरिंग" किसी भी प्रकार के बारे में चिंता की जरूरत नहीं है newके रूप में पथ का एक ही स्तर पर है downloads, तो आप सिर्फ में सब कुछ ले जा सकते हैं downloadsकरने के लिए new, और उसके बाद के लिए कदम newdownloads` में।

हालांकि, अगर आप पहले से ही सबफ़ोल्डर है, तो newबनाया है और, दूसरा बनाने के लिए चिंता नहीं नहीं करना चाहता - बस बदलने के mkdirपहले के बाईं ओर आदेश &&आदेश एक करने के लिए ऊपर दिखाए में mvआदेश, धक्का newमें पथ; दूसरे शब्दों में, जबकि आप अभी भी कर रहे हैं /myuser/downloads/, आप बदल सकते हैं mkdir ../newकरने के लिए mv new ..। फिर सबफ़ोल्डर new[पथ में /myuser/downloads/new/] /myuser/new/के समान स्तर पर धकेल दिया जाता है /myuser/downloads/, और फिर आप शेष कमांड को चला सकते हैं जैसा कि ऊपर दिखाया गया है। सभी एक साथ, हमारे पास हैं, पथ से शुरू /myuser/downloads/:

mv new .. && mv * ../new && mv ../new ../downloads

और, चूंकि आप "डाउनलोड फ़ोल्डर में सभी फ़ाइलों और फ़ोल्डरों / उप-फ़ोल्डरों को उप-फ़ोल्डर [ new]" में स्थानांतरित करना चाहते थे , तो आप कर रहे हैं! यदि आप केवल फ़ाइलें (या केवल फ़ोल्डर या [अधिक दानेदार वस्तु आंदोलन सम्मिलित करें]) स्थानांतरित करना चाहते थे , तो आपको अन्य कमांड का उपयोग करना होगा जो ऑब्जेक्ट्स को "फ़िल्टर" कर सकते हैं, जैसे grep। ऊपर लिखी गई कमांड आपके उद्देश्यों के लिए पर्याप्त हैं, हालाँकि।

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