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


133

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

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


मेरे पास प्रश्नों को फिर से लिखने के लिए पर्याप्त प्रतिनिधि नहीं है, लेकिन क्या मैं सुझाव दे सकता हूं [linux] [mv] [cwd] [files], या कुछ इसी तरह का?
Stephan202

मैंने इस प्रश्न को Stephan202 के अनुरोध के अनुसार लिया है।
ग्यारह ग्यारह

जवाबों:


202

जिस कमांड को आप देख रहे हैं वह है

mv * .[^.]* ..

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

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

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

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


.[^.]*इसके बजाय क्यों .*?

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

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

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

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

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


7
का उपयोग .*के कारण हो सकता mv नहीं ले जाने में सक्षम होने के बारे में चेतावनी / त्रुटियां उत्पन्न हो .और ..। आप mv * .[^.]* ..इसके बजाय कोशिश कर सकते हैं ।
क्रिस जॉन्सन

1
@alain: आपका स्वागत है, और साइट पर आपका स्वागत है! (यदि (और केवल अगर) तो यहां के पदों में से एक ने आपके प्रश्न का पर्याप्त रूप से उत्तर दिया है, तो आप इसे इस तरह से चिह्नित कर सकते हैं। इससे पोस्टर को 15 अतिरिक्त प्रतिष्ठा अंक मिलेंगे, और आपको 2 प्रतिनिधि अतिरिक्त भी
मिलेंगे

मैं वास्तव में एक
सबशेल

2
इसमें कोई नुकसान नहीं है। * सिंटेक्स - सहित .. केवल तब खतरनाक होता है जब इसका उपयोग चामोड और चाउन के साथ किया जाता है और "रिकर्व" ध्वज, यानी चामोद-आर या चाउन-आर। और उन मामलों में, कभी भी chown टाइप न करें । * या chmod। * - जिस मार्ग की आप तलाश कर रहे हैं और उपयोग -h (प्रतीकात्मक लिंक का पालन न करें) में शीर्ष निर्देशिका को चुनें। लेकिन, एमवी .. बस कुछ भी नहीं करता है तो इसके बारे में चिंता न करें।
क्रिस

1
सही तीन पैटर्न हैं *, .[^.]*और ..?*। दूसरा शायद .[!.]*पुराने (POSIX) गोले के लिए। इसे भी पढ़ें

42

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

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

लंबा जवाब:

आदेश

mv * .* ..

काम नहीं .*कर सकते हैं क्योंकि मैच .और कर सकते हैं ..। लेकिन आज्ञा

mv * .[^.]* ..

यह भी काम नहीं करेगा, क्योंकि .[^.]*मैच नहीं होगा, जैसे ..filename,! इसके बजाय, मैं क्या करता हूं

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

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

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

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

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


1
इसके अलावा, मैं इस बात पर ध्यान देना भूल गया कि - ताकि डैश के साथ शुरू होने वाले फ़ाइल नामों के साथ कमांड सही ढंग से काम करे। हालांकि मैंने अपने जवाब में इसे शामिल किया है। ग्लब्स का उपयोग करने वाला एक अधिक पूर्ण उत्तर "mv - *। [^।] है। ?? * .."।
पगस

+1: मैं ..?*अपनी टिप्पणी में जोड़ने के लिए वापस आया था , और आपने पहले से ही इसका ध्यान रखा था।
क्रिस जॉन्सन

1
एमवी करने की कोशिश में क्या गलत हो सकता है ..? यह बस कुछ नहीं करता है और कुछ भी नहीं कर सकता है। ऐसे अन्य कमांड हैं जहां यह कुछ कर सकता है (chmod और chown) लेकिन एमवी और आरएम केवल कुछ भी नहीं करते हैं। या ..
क्रिस

1
यह mv: अवैध विकल्प - t
pal4life

1
बोनो, डबल डैश mvकिसी भी आगे के कमांड विकल्पों की तलाश को रोकना बताता है। ब्रेसिज़ एक परिणामी फ़ाइल नाम है। प्लस चिह्न कहता है कि निष्पादन के प्रति परिणाम (यानी प्रति फ़ाइल नाम) चलाने के बजाय, एक ही निष्पादन में अधिक से अधिक परिणाम डालें। पूर्णता के लिए, -t..इन सभी फ़ाइलों को स्थानांतरित करने के लिए लक्ष्य गंतव्य को स्थानांतरित करने के लिए कह रहा है।
1

14

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

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

+1। बहुत सफाई वाला। मुझे लगता है कि थोड़ा सुधार क्रम में है, हालांकि। मेरे उत्तर के लिए अद्यतन देखें।
Stephan202

8

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

cp -rf . ..

rm -rf *

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


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

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

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

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

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

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


1
थोड़ा और स्पष्टीकरण अच्छा होगा।
क्रिस एफएन

यकीन है, उम्मीद है कि यह अब और अधिक स्पष्ट है।
मृच्छुक

ध्यान दें कि --remove-source-filesनिर्देशिकाओं को (सिंक्रनाइज़) हटाया नहीं जाएगा।
डेनिस

अच्छा, स्वीकृत समाधान मुझे -bash: /bin/mv: Argument list too longत्रुटि देता है । यह एक आकर्षण की तरह काम करता है।
6

2

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


2
mv * .??* ../.

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

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


2
आप .[^.]कवर फ़ाइलों को प्राप्त करने के लिए जोड़ सकते हैं .a
क्रिस जॉन्सन

../ और ../ में कोई अंतर नहीं है। इसलिए मैं टाइपिंग को परेशान नहीं करूंगा। स्लैश के बाद। इसके अलावा, एमवी और आरएम के मामले में, इसे शामिल करने के लिए कोई नुकसान नहीं है। और .. सूची में, अर्थात कुछ भी डरावना या गलत नहीं है mv *। * / path / to / file /, बस rm के रूप में। या यहां तक ​​कि -rf। कुछ नहीं करता।
क्रिस

2

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

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

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

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

विशेषताएं:

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

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

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

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

Naive कार्यान्वयन:

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

    mv * ..
    
  2. निम्नलिखित मैच .. जो प्रत्येक निर्देशिका को वर्तमान कार्यशील निर्देशिका ($ PWD या pwd) के लिए / फिर से .. हर निर्देशिका में स्थानांतरित करने का प्रयास करता है। कभी उपयोग न करो।

    mv .* ..
    

2

पैटर्न का उपयोग करना अधिक सही है * .[!.] .??*, * .[^.] .??*क्योंकि पूर्व में पुराने गोले जैसे ksh88 के साथ भी काम किया जाएगा:

mv -- * .[!.] .??* ..
  • -- जब आपके पास एक फ़ाइल का नाम होता है जो समस्याओं को रोकता है -
  • * सभी फ़ाइल नामों से मेल खाता है, जो एक के साथ शुरू नहीं होता है .
  • कोई एक वर्ण फ़ाइल नाम नहीं हैं, जो .कि आप जिस पर चल सकते हैं, उसके साथ शुरू होते हैं
  • .[!.] सभी दो चरित्र फ़ाइल नामों से मेल खाता है जो एक के साथ शुरू होता है .
  • .??* सभी तीन चरित्र फ़ाइल नामों (या लंबे समय) से मेल खाता है जो एक के साथ शुरू होता है .

Ksh88 के साथ, फ़ाइल नाम पैटर्न .[^.]वास्तव में फ़ाइल नामों ..(जो हमेशा मौजूद होता है) और .^(जो संभवतः मौजूद नहीं है) से मेल खाता है, जो वांछित है उसके विपरीत प्रभाव पड़ता है।


0

खोजें और grep काम भी करें। यदि आप खोज और egrep को संशोधित करके अधिक जटिल मानदंडों पर फ़ाइलों का चयन करना चाहते हैं तो इस तरह की संरचना सहायक हो सकती है।

find -maxdepth 1 | egrep '^./.'         # Returns all files

mv `find -maxdepth 1 | egrep '^./.'` .. # mv <all files> ..

0

मुझे लगता है कि सभी फाइलों को इसके मूल dir में ले जाने का सबसे आसान समाधान है। होने वाला

mv "`ls`" ../

या, यदि छिपी हुई फाइलें / निर्देशिकाएं हैं

उपयोग:

mv "`ls -a`" ../ 2>/dev/null

इसके अलावा, आप कुछ फ़ोल्डर की सामग्री को उसके आंतरिक फ़ोल्डर टॉनी (कहना) में ले जाना चाहते हैं

उपयोग:

mv "`ls -a`" /tony 2>/dev/null

ध्यान दें:

"`ls -a`" 

उन फ़ाइलों को स्थानांतरित करने के लिए जिनमें रिक्त स्थान हैं।

2>/dev/null

चेतावनी / त्रुटि को दबाने के लिए है क्योंकि ls -aप्रिंट .और ..फ़ोल्डर को भी प्रिंट करेगा और आप उन्हें स्थानांतरित या कॉपी नहीं कर सकते। तो उन फ़ोल्डरों के लिए यह त्रुटि दिखाएगा (यदि हम 2> / dev / null का उपयोग नहीं करते हैं) कि यह उन्हें स्थानांतरित नहीं कर सकता है और बाकी को काफी आराम से स्थानांतरित किया जाएगा।

बचने के लिए सबसे अच्छा ls -aअगर कोई छिपी हुई फ़ाइलें नहीं हैं और बस उपयोग करें ls


क्या आपने कोशिश की है कि जब आप दौड़ेंगे तो क्या होगा mv $(ls -a)? वह वर्तमान निर्देशिका और उसके नीचे निर्देशिका पर टैप ls -aकरेगा , क्योंकि ..साथ ही आउटपुट भी करेगा ।
सामी Laine

धन्यवाद, @SamiLaine सुझाव के लिए मैंने सुधार किया है। लेकिन mv ls -a ../जरूरत के अनुसार काम भी किया होगा, हां यह उन त्रुटियों को दिखाएगा जैसा कि मैंने ऊपर उल्लेख किया है, लेकिन इसके अलावा यह आवश्यक फ़ोल्डर / फ़ाइलों को मूल डीआईआर में स्थानांतरित कर देगा।
प्रभात कुमार सिंह

यह रिक्त स्थान वाली फ़ाइलों के लिए काम नहीं करेगा।
kenorb

@kenorb lsको रिक्त स्थान के साथ फ़ाइलों को स्थानांतरित करने के लिए कमांड को दोगुना करने की आवश्यकता है । मैंने आवश्यक परिवर्तन किए हैं। इशारा करने के लिए धन्यवाद।
प्रभात कुमार सिंह
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.