लिनक्स में वर्तमान निर्देशिका से ऊपरी निर्देशिका तक सभी फ़ाइलों को कैसे स्थानांतरित करें?
मैंने कुछ कोशिश की mv *.*
, लेकिन यह काम नहीं करता है।
लिनक्स में वर्तमान निर्देशिका से ऊपरी निर्देशिका तक सभी फ़ाइलों को कैसे स्थानांतरित करें?
मैंने कुछ कोशिश की mv *.*
, लेकिन यह काम नहीं करता है।
जवाबों:
जिस कमांड को आप देख रहे हैं वह है
mv * .[^.]* ..
या (अधिक जानकारी के लिए नीचे देखें):
(shopt -s dotglob; mv -- * ..)
स्पष्टीकरण: mv
कमांड फाइलों और निर्देशिकाओं को स्थानांतरित करता है। अंतिम तर्क mv
लक्ष्य है (इस मामले में निर्देशिका एक कदम "ऊपर" पेड़ में है, ..
)। इससे पहले के तर्क स्रोत फाइलें और निर्देशिकाएं हैं। तारांकन चिह्न ( *
) एक वाइल्डकार्ड है, जो सभी फाइलों से मेल खाता है, जो डॉट के साथ शुरू नहीं होते हैं। डॉट (डॉटफ़ाइल्स) से शुरू होने वाली फाइलें "छिपी" होती हैं। वे पैटर्न का उपयोग करके मेल खाते हैं .[^.]*
(नीचे संपादित देखें)।
उस मैनपेज को देखें जिसे मैंने अधिक जानकारी के लिए लिंक किया था mv
।
.[^.]*
इसके बजाय क्यों .*
?जैसा कि क्रिस जॉन्सन सही बताते हैं: पैटर्न .*
भी मेल खाता है .
और ..
। चूँकि आप उन्हें नहीं चाहते (और नहीं) ले जा सकते हैं, ऐसे पैटर्न का उपयोग करना बेहतर है जो उन दो को छोड़कर डॉट के साथ शुरू होने वाले किसी भी फ़ाइल नाम से मेल खाता हो । पैटर्न .[^.]*
सिर्फ इतना है कि करता है: यह किसी भी फ़ाइल नाम (1) एक बिंदु (2) एक चरित्र जो है द्वारा पीछा के साथ शुरू से मेल खाता नहीं एक बिंदु (3) शून्य या अधिक स्वैच्छिक वर्णों का स्थान है।
जैसा कि पगस बताते हैं , हमें .??*
दो डॉट्स से शुरू होने वाली फाइलों से मिलान करने के लिए पैटर्न को भी जोड़ना होगा । एक वैकल्पिक समाधान के लिए उसका जवाब देखें find
।
अर्जन के जवाबshopt
में डॉटफाइल्स के साथ उन सभी मुद्दों से बचने के लिए उल्लेख किया गया है। लेकिन तब डैश के साथ शुरू होने वाली फ़ाइलों के साथ समस्या अभी भी है। और इसके लिए तीन कमांड की आवश्यकता होती है। फिर भी, मुझे यह विचार पसंद है। मैं इसे इस तरह उपयोग करने का प्रस्ताव देता हूं:
(shopt -s dotglob; mv -- * ..)
यह shopt
एक उपधारा में निष्पादित होता है (इस प्रकार shopt
आवश्यक होने के लिए कोई दूसरा कॉल नहीं ) और उपयोग करता है --
ताकि डैश के साथ शुरू होने वाली फ़ाइलों को तर्क के रूप में व्याख्या नहीं किया जाएगा mv
।
.*
के कारण हो सकता mv नहीं ले जाने में सक्षम होने के बारे में चेतावनी / त्रुटियां उत्पन्न हो .
और ..
। आप mv * .[^.]* ..
इसके बजाय कोशिश कर सकते हैं ।
संक्षिप्त उत्तर: उपयोग
find . -mindepth 1 -maxdepth 1 -exec mv -t.. -- {} +
लंबा जवाब:
आदेश
mv * .* ..
काम नहीं .*
कर सकते हैं क्योंकि मैच .
और कर सकते हैं ..
। लेकिन आज्ञा
mv * .[^.]* ..
यह भी काम नहीं करेगा, क्योंकि .[^.]*
मैच नहीं होगा, जैसे ..filename
,! इसके बजाय, मैं क्या करता हूं
mv * .[^.] .??* ..
जो सिवाय .
और सब कुछ मैच करेगा ..
। *
सब कुछ है कि एक के साथ शुरू नहीं करता है मैच होगा .
, .[^.]
एक डॉट के अलावा सभी 2 चरित्र फ़ाइल नाम के साथ शुरू होगा ..
, और .??*
कम से कम 3 वर्णों के साथ एक डॉट के साथ शुरू सभी फ़ाइल नाम से मेल खाएंगे।
बेहतर अभी तक, आप उपयोग कर सकते हैं
find . -mindepth 1 -maxdepth 1 -exec mv -t.. -- {} +
जो बदसूरत ग्लोब हैक में बचा जाता है mv * .[^.] .??* ..
!
..?*
अपनी टिप्पणी में जोड़ने के लिए वापस आया था , और आपने पहले से ही इसका ध्यान रखा था।
mv
किसी भी आगे के कमांड विकल्पों की तलाश को रोकना बताता है। ब्रेसिज़ एक परिणामी फ़ाइल नाम है। प्लस चिह्न कहता है कि निष्पादन के प्रति परिणाम (यानी प्रति फ़ाइल नाम) चलाने के बजाय, एक ही निष्पादन में अधिक से अधिक परिणाम डालें। पूर्णता के लिए, -t..
इन सभी फ़ाइलों को स्थानांतरित करने के लिए लक्ष्य गंतव्य को स्थानांतरित करने के लिए कह रहा है।
बस पूर्णता के लिए के लिए, एक भी बैश खोल छिपा फ़ाइलों को शामिल करने, बता सकते हैं का उपयोग कर shopt
:
shopt -s dotglob
mv -- * ..
shopt -u dotglob
Mv का उपयोग करते समय छिपी हुई फ़ाइलों को स्थानांतरित करने की कार्यक्षमता का अभाव है *
- तो इसके बजाय कॉपी का उपयोग क्यों न करें?
cp -rf . ..
rm -rf *
Dotglobbing के जटिल समाधानों में जाने की आवश्यकता नहीं है और खोज आदेशों का उपयोग करें।
cp
और rm
इसके बजाय आप वास्तव में सभी की नकल कर रहे हैं।
rsync -a --remove-source-files . ..
rsync
आम तौर पर कुशल वृद्धिशील दूरस्थ बैकअप और दर्पणों के प्रदर्शन के लिए उपयोग किया जाने वाला एक अत्यंत शक्तिशाली फाइल कॉपी टूल है।
उपरोक्त आदेश के साथ, हम कह रहे हैं rsync
की सामग्री की नकल करने के लिए .
में..
स्विच उपनिर्देशिका -a
में पुनरावृत्ति को .
सक्षम करता है और कुछ अन्य सामान्य विकल्पों को सक्षम करता है।
स्विच --remove-source-files
एक सफल प्रतिलिपि के बाद स्रोत फ़ाइलों को हटाने के लिए rsync को बताता है, अर्थात यह rsync को mv
कमांड के समान व्यवहार करता है ।
--remove-source-files
निर्देशिकाओं को (सिंक्रनाइज़) हटाया नहीं जाएगा।
-bash: /bin/mv: Argument list too long
त्रुटि देता है । यह एक आकर्षण की तरह काम करता है।
अंततः प्रयास mv .
करना विफल हो जाएगा क्योंकि mv उस निर्देशिका को अनलिंक नहीं कर पाएगा जो आप वर्तमान में हैं। आप mv * ..
फ़ाइलों को cdd में स्थानांतरित कर सकते हैं।
mv * .??* ../.
*
सभी नहीं-डॉट फ़ाइलें प्राप्त करता है। .??*
सब मिलता है। कम से कम तीन बाइट्स वाली फाइलें, जो सभी वैध लोगों के लिए काम करती हैं। कुछ भी छोड़ दिया तो आप शायद करना चाहते हैं rm
न कि mv
वैसे भी।
../.
किसी भी प्रत्यक्ष लाभ से अधिक की पेशकश नहीं करता ..
, लेकिन जब एक कदम-से-निर्देशिका कर यह, एक बहुत अच्छा में प्राप्त करने के लिए आदत है, क्योंकि यह, असफल हो जायेगी रूप में आप चाहते हैं, अगर वहाँ कुछ पथ के साथ गलत है। उदाहरण के लिए, mv xyz bletch
जहां आपको लगता bletch
है कि निर्देशिका है, के साथ और अधिक निश्चित किया जा सकता है mv xyz bletch/.
।
.[^.]
कवर फ़ाइलों को प्राप्त करने के लिए जोड़ सकते हैं .a
।
यह न्यूनतम आदेश अधिकांश आधुनिक गोले पर काम करता है:
\mv -- {,.{[^.],??}}* ..
अन्यथा उल्लेख एक पोर्टेबल समाधान है:
\mv -- * .[^.] .??* ..
विशेषताएं:
\ _ उपनामों को एमवी अवांछनीय रूप से बदलने से रोकता है।
- कमांड-लाइन तर्कों के रूप में व्याख्या करने से अग्रणी हाइफ़न (-xyz) वाले फ़ाइलनाम को रोकता है।
। [^] के साथ शुरू होने वाले सभी दो चरित्र फ़ाइलनामों से मेल खाता है। के सिवाय ..
? * * अन्य सभी फ़ाइल नाम तीन वर्णों या लंबे समय तक मेल खाता है।
Naive कार्यान्वयन:
निम्नलिखित स्किप UNIX फ़ाइलनामों को छिपाते हैं, जो कि इसके साथ शुरू होते हैं। (.Bashrc)।
mv * ..
निम्नलिखित मैच .. जो प्रत्येक निर्देशिका को वर्तमान कार्यशील निर्देशिका ($ PWD या pwd) के लिए / फिर से .. हर निर्देशिका में स्थानांतरित करने का प्रयास करता है। कभी उपयोग न करो।
mv .* ..
पैटर्न का उपयोग करना अधिक सही है * .[!.] .??*
, * .[^.] .??*
क्योंकि पूर्व में पुराने गोले जैसे ksh88 के साथ भी काम किया जाएगा:
mv -- * .[!.] .??* ..
--
जब आपके पास एक फ़ाइल का नाम होता है जो समस्याओं को रोकता है -
*
सभी फ़ाइल नामों से मेल खाता है, जो एक के साथ शुरू नहीं होता है .
.
कि आप जिस पर चल सकते हैं, उसके साथ शुरू होते हैं.[!.]
सभी दो चरित्र फ़ाइल नामों से मेल खाता है जो एक के साथ शुरू होता है .
.??*
सभी तीन चरित्र फ़ाइल नामों (या लंबे समय) से मेल खाता है जो एक के साथ शुरू होता है .
Ksh88 के साथ, फ़ाइल नाम पैटर्न .[^.]
वास्तव में फ़ाइल नामों ..
(जो हमेशा मौजूद होता है) और .^
(जो संभवतः मौजूद नहीं है) से मेल खाता है, जो वांछित है उसके विपरीत प्रभाव पड़ता है।
खोजें और grep काम भी करें। यदि आप खोज और egrep को संशोधित करके अधिक जटिल मानदंडों पर फ़ाइलों का चयन करना चाहते हैं तो इस तरह की संरचना सहायक हो सकती है।
find -maxdepth 1 | egrep '^./.' # Returns all files
mv `find -maxdepth 1 | egrep '^./.'` .. # mv <all files> ..
मुझे लगता है कि सभी फाइलों को इसके मूल 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
करेगा , क्योंकि ..
साथ ही आउटपुट भी करेगा ।
mv ls -a ../
जरूरत के अनुसार काम भी किया होगा, हां यह उन त्रुटियों को दिखाएगा जैसा कि मैंने ऊपर उल्लेख किया है, लेकिन इसके अलावा यह आवश्यक फ़ोल्डर / फ़ाइलों को मूल डीआईआर में स्थानांतरित कर देगा।
ls
को रिक्त स्थान के साथ फ़ाइलों को स्थानांतरित करने के लिए कमांड को दोगुना करने की आवश्यकता है । मैंने आवश्यक परिवर्तन किए हैं। इशारा करने के लिए धन्यवाद।
[linux] [mv] [cwd] [files]
, या कुछ इसी तरह का?