सवाल सभी फ़ाइलों को वर्तमान निर्देशिका से ऊपरी निर्देशिका में कैसे स्थानांतरित करें?


लिनक्स में सभी निर्देशिका को मौजूदा निर्देशिका से ऊपरी निर्देशिका में कैसे स्थानांतरित करें?

मैंने कुछ ऐसा करने की कोशिश की mv *.*, लेकिन यह काम नहीं करता है।


126
2017-10-28 18:54


मूल


मेरे पास प्रश्नों को पुनः प्राप्त करने के लिए पर्याप्त प्रतिनिधि नहीं हैं, लेकिन क्या मैं सुझाव दे सकता हूं [linux] [mv] [cwd] [files], या कुछ समान है? - Stephan202
मैंने स्टीफन 202 के अनुरोध के प्रति इस सवाल को दोबारा हासिल कर लिया है। - eleven81
unix.stackexchange.com/a/251091/139312 - palindrom


जवाब:


जिस आदेश को आप ढूंढ रहे हैं वह है

mv * .[^.]* ..

या (अधिक जानकारी के लिए नीचे देखें):

(shopt -s dotglob; mv -- * ..)

स्पष्टीकरण: द mv आदेश फ़ाइलें और निर्देशिका चलाता है। अंतिम तर्क mv लक्ष्य है (इस मामले में निर्देशिका पेड़ में एक कदम "ऊपर" है, ..)। इससे पहले तर्क स्रोत फ़ाइलें और निर्देशिका हैं। तारांकन (*) एक वाइल्डकार्ड है जो सभी फ़ाइलों से मेल खाता है जो डॉट से शुरू नहीं होते हैं। एक डॉट (डॉटफाइल) से शुरू होने वाली फ़ाइलें "छिपी हुई" हैं। वे पैटर्न का उपयोग कर मिलान कर रहे हैं .[^.]* (नीचे संपादित देखें)।

उस मैनपेज को देखें जिसे मैंने अधिक जानकारी के लिए लिंक किया था mv


क्यूं कर .[^.]* के बजाय .* ?

जैसा क्रिस जॉन्सन सही ढंग से बताता है: पैटर्न .* भी मेल खाता है . तथा ..। चूंकि आप उनको स्थानांतरित नहीं करना चाहते (और नहीं कर सकते), ऐसे पैटर्न का उपयोग करना बेहतर होता है जो किसी बिंदु से शुरू होने वाले किसी फ़ाइल नाम से मेल खाता है उन दो को छोड़कर। पैटर्न .[^.]* ऐसा ही करता है: यह किसी भी फ़ाइल नाम (1) से मेल खाता है जो एक बिंदु (2) से होता है जिसके बाद एक वर्ण होता है नहीं एक बिंदु (3) शून्य या अधिक मनमाना वर्णों के बाद।

जैसा Paggas  बताता है, हमें पैटर्न भी जोड़ना होगा .??* दो बिंदुओं से शुरू होने वाली फाइलों से मेल खाने के लिए। एक वैकल्पिक समाधान का उपयोग कर उसका जवाब देखें find

अर्जन के उत्तर उल्लेख है shopt dotfiles के साथ उन सभी मुद्दों से बचने के लिए। लेकिन फिर भी एक डैश से शुरू होने वाली फाइलों के साथ समस्या है। और इसके लिए तीन आदेशों की आवश्यकता है। फिर भी, मुझे विचार पसंद है। मैं इसे इस तरह इस्तेमाल करने का प्रस्ताव करता हूं:

(shopt -s dotglob; mv -- * ..)

यह निष्पादित करता है shopt एक सबहेल में (इस प्रकार कोई दूसरी कॉल नहीं shopt आवश्यक) और उपयोग करता है -- ताकि एक डैश से शुरू होने वाली फ़ाइलों को तर्क के रूप में व्याख्या नहीं किया जाएगा mv


194
2017-10-28 19:01



का उपयोग करते हुए .* कारण हो सकता है mv स्थानांतरित करने में सक्षम नहीं होने के बारे में चेतावनियां / त्रुटियां उत्पन्न करने के लिए . तथा ..। आप कोशिश कर सकते हैं mv * .[^.]* .. बजाय। - Chris Johnsen
बहुत पूरा जवाब धन्यवाद।
@alain: आपका स्वागत है, और साइट पर आपका स्वागत है! (यदि (यहां केवल अगर) पदों में से एक ने आपके प्रश्न का पर्याप्त उत्तर दिया है, तो आप इसे इस तरह चिह्नित कर सकते हैं। इससे पोस्टर 15 अतिरिक्त प्रतिष्ठा अंक प्राप्त होंगे, और आपको 2 प्रतिनिधि अतिरिक्त भी मिलेंगे।) - Stephan202
*। * वाक्यविन्यास में कोई हानि नहीं है - सहित .. केवल चतुर और चोटी और "रिकर्स" ध्वज, यानी chmod -R या chown -R के साथ उपयोग किए जाने पर ही खतरनाक है। और उन मामलों में, कभी मत करो कभी टाइप करें। * या chmod। * - जिस पथ को आप ढूंढ रहे हैं उसमें शीर्ष निर्देशिका को दिखाएं और उपयोग करें- एच (प्रतीकात्मक लिंक का पालन न करें)। लेकिन, एमवी .. बस कुछ भी नहीं करता है इसलिए इसके बारे में चिंता न करें। - chris
सही तीन पैटर्न हैं *, .[^.]* तथा ..?*। दूसरा शायद .[!.]* पुराने (पीओएसईक्स) गोले के लिए। यह भी पढ़ें


संक्षिप्त उत्तर: उपयोग करें

find . -mindepth 1 -maxdepth 1 -exec mv -t.. -- {} +

लंबा जवाब:

आदेश

mv * .* ..

तब से काम नहीं करेगा .* मिल सकता है . तथा ..। लेकिन आदेश

mv * .[^.]* ..

तब से काम नहीं करेगा .[^.]* मेल नहीं खाएगा, उदाहरण के लिए, ..filename! इसके बजाय, मैं क्या करता हूं

mv * .[^.] .??* ..

जो सबकुछ छोड़कर मेल खाएगा . तथा ..* सबकुछ से मेल खाएगा जो एक के साथ शुरू नहीं होता है ., .[^.] छोड़कर एक बिंदु के साथ शुरू होने वाले सभी 2 वर्ण फ़ाइल नामों से मेल खाएगा .., तथा .??* कम से कम 3 अक्षरों वाले डॉट से शुरू होने वाले सभी फ़ाइल नामों से मेल खाएगा।

बेहतर अभी तक, आप इसका उपयोग कर सकते हैं

find . -mindepth 1 -maxdepth 1 -exec mv -t.. -- {} +

जो बदसूरत ग्लोब हैक से बचाता है mv * .[^.] .??* ..!


42
2017-10-28 20:19



इसके अलावा, मैं महत्व को ध्यान में रखना भूल गया - ताकि आदेश डैश से शुरू होने वाले फ़ाइल नामों के साथ सही ढंग से काम करता हो। मैंने शामिल किया है - हालांकि मेरे खोज जवाब में। ग्लब्स का उपयोग करके एक और पूर्ण उत्तर "एमवी - *। [^।]। ?? * .." है। - Paggas
+1: मैं वापस जोड़ने के लिए आया था ..?* मेरी टिप्पणी के लिए, और आप पहले से ही इसका ख्याल रखा था। - Chris Johnsen
एमवी की कोशिश करने के साथ संभवतः क्या गलत हो सकता है ..? यह बस कुछ भी नहीं करता है और कुछ भी नहीं कर सकता है। अन्य आदेश भी हैं जहां यह कर सकते हैं कुछ करो (chmod और chown) लेकिन एमवी और आरएम बस कुछ भी नहीं करते हैं। या .. - chris
यह एमवी देता है: अवैध विकल्प - टी - pal4life
बोनो, डबल डैश बताता है mv किसी और कमांड विकल्प की तलाश करना बंद करें। ब्रेसिज़ परिणामस्वरूप फ़ाइल नाम हैं। प्लस साइन कहते हैं कि परिणाम प्रति निष्पादन (यानि प्रति फ़ाइल नाम) चलाने के बजाए, जितना संभव हो सके एक ही निष्पादन में कई परिणाम डाल दें। संपूर्णता के लिए, -t.. इन सभी फ़ाइलों को स्थानांतरित करने के लिए लक्षित गंतव्य को स्थानांतरित कर रहा है। - isuldor


बस पूर्णता के लिए, कोई भी छिपी हुई फाइलों को शामिल करने के लिए बैश खोल को भी बता सकता है shopt:

shopt -s dotglob
mv -- * ..
shopt -u dotglob

14
2017-10-28 20:52



+1। बहुत साफ मुझे लगता है कि मामूली सुधार क्रम में है। मेरे उत्तर में अपडेट देखें। - Stephan202


एमवी का उपयोग करते समय छिपी हुई फाइलों को स्थानांतरित करने की कार्यक्षमता की कमी है * - तो इसके बजाय कॉपी का उपयोग क्यों नहीं करें?

cp -rf . ..

rm -rf *

Dotglobbing के जटिल समाधान और खोजने के आदेशों का उपयोग करने की आवश्यकता नहीं है।


8
2017-08-02 20:46



चेतावनी यदि आप में आगे बढ़ रहे हैं एक ही फाइल सिस्टम, मामलों के सबसे बड़े हिस्से में आपने वास्तव में फ़ाइलों की प्रतिलिपि नहीं बनाई है, लेकिन इनोड या फ़ाइल contenents को घुमाने के बिना केवल निर्देशिका प्रविष्टियों को अद्यतन करें। यहां तक ​​कि देखें [1]। के साथ cp तथा rm इसके बजाय आप वास्तव में सभी की प्रतिलिपि बना रहे हैं। - Hastur


rsync -a --remove-source-files . ..

rsync एक बेहद शक्तिशाली फ़ाइल प्रतिलिपि उपकरण है, जो आमतौर पर कुशल वृद्धिशील रिमोट बैकअप और दर्पण करने के लिए उपयोग किया जाता है।

उपर्युक्त आदेश के साथ, हम कह रहे हैं rsync की सामग्री की प्रतिलिपि बनाने के लिए . में ..

स्विच -a रिकर्सन में सक्षम बनाता है . उपनिर्देशिकाएं और कुछ अन्य सामान्य विकल्पों को सक्षम बनाता है।

स्विच --remove-source-files सफल प्रतिलिपि के बाद स्रोत फ़ाइलों को निकालने के लिए rsync को बताता है, यानी यह rsync समान रूप से व्यवहार करता है mv आदेश।


6
2018-01-20 11:47



थोड़ा और स्पष्टीकरण अच्छा होगा। - ChrisF
निश्चित रूप से, उम्मीद है कि यह अब और अधिक स्पष्ट है। - mrucci
ध्यान दें कि --remove-source-files निर्देशिका (सिंक्रनाइज़) निर्देशिका नहीं हटाएगा। - Dennis
अच्छा, स्वीकार्य समाधान मुझे देता है -bash: /bin/mv: Argument list too long त्रुटि। यह आकर्षण की तरह काम करता है। - userlond


आखिरकार कोशिश कर रहा हूँ mv . विफल हो जाएगा क्योंकि एमवी उस निर्देशिका को अनलिंक करने में सक्षम नहीं होगा जिसमें आप वर्तमान में हैं। आप कर सकते हैं mv * .. सीडब्ल्यूडी में फ़ाइलों को स्थानांतरित करने के लिए।


2
2017-10-28 18:59



हाय धन्यवाद कि काम किया!


mv * .??* ../.

* सभी डॉट फाइलें मिलती है। .??* सब मिल जाता है फ़ाइलों को कम से कम तीन बाइट लंबा, जो सभी कानूनी लोगों के लिए काम करता है। कुछ भी आपको छोड़ना चाहता है rm बजाय mv वैसे भी।

../. किसी भी प्रत्यक्ष लाभ की पेशकश नहीं करता है .. लेकिन जब एक चाल-निर्देशिका में किया जाता है तो इसमें प्रवेश करने की एक बहुत अच्छी आदत होती है, क्योंकि यदि आप चाहते हैं, तो यह विफल हो जाएगा, अगर पथ में कुछ गड़बड़ है। उदाहरण के लिए, mv xyz bletch, आप कहाँ सोच  bletch एक निर्देशिका है, के साथ और अधिक निश्चित किया जा सकता है mv xyz bletch/.


2
2017-10-28 19:47



आप जोड़ सकते हैं .[^.] जैसे कवर फाइलें प्राप्त करने के लिए .a। - Chris Johnsen
../ और ../ के बीच कोई अंतर नहीं है। तो मैं टाइपिंग परेशान नहीं होगा। स्लैश के बाद। इसके अलावा, एमवी और आरएम के मामले में, इसमें शामिल करने के लिए कोई नुकसान नहीं होता है। और .. सूची में, यानी एमवी *। * / पथ / से / फ़ाइल / के साथ कुछ भी डरावना या गलत नहीं है, बस आरएम के रूप में। या यहां तक ​​कि आरआरएफ। कुछ नहीं करता - chris


यह न्यूनतम आदेश अधिकांश आधुनिक गोले पर काम करता है:

\mv -- {,.{[^.],??}}* ..

अन्यथा एक पोर्टेबल समाधान का उल्लेख किया गया है:

\mv -- * .[^.] .??* ..

विशेषताएं:

  1. \ अवांछित रूप से एमवी बदलने से उपनाम रोकता है।

  2. - कमांड लाइन तर्क के रूप में व्याख्या किए जाने से अग्रणी हाइफ़न (-xyz) युक्त फ़ाइल नामों को रोकता है।

  3. [^।] से शुरू होने वाले सभी दो वर्ण फ़ाइल नामों से मेल खाता है। के सिवाय ..

  4. .?? * सभी अन्य फ़ाइल नामों को तीन वर्ण या उससे अधिक समय से मेल खाता है।

बेकार कार्यान्वयन:

  1. निम्नलिखित skips UNIX फ़ाइल नाम छिपाए गए हैं, जो शुरू होते हैं। (.Bashrc)।

    mv * ..
    
  2. निम्नलिखित मैचों .. जो वर्तमान कार्यशील निर्देशिका ($ पीडब्ल्यूडी या पीडब्ल्यूडी) के अंततः सभी निर्देशिकाओं को वापस / में स्थानांतरित करने का प्रयास करता है। कभी उपयोग न करो।

    mv .* ..
    

2
2017-08-12 08:12