माता-पिता निर्देशिका में छिपी हुई फ़ाइलों सहित सभी फ़ाइलों को कैसे स्थानांतरित करें *


113

यह एक लोकप्रिय प्रश्न होना चाहिए लेकिन मुझे इसका उत्तर नहीं मिला।

* के माध्यम से * माता पिता की निर्देशिका के रूप में अच्छी तरह से छिपा फ़ाइलों सहित सभी फ़ाइलों को स्थानांतरित करने के लिए कैसे:

mv /path/subfolder/* /path/

यह सभी फाइलों को पेरेंट डायरेक्टरी की ओर ले जाएगा, जैसी कि उम्मीद की जा रही है, लेकिन छिपी हुई फाइल्स को मूव नहीं करेगा। उसको कैसे करे?


1
इस सवाल का एसयू में एक डुप्लिकेट है , एक और भी सही उत्तर के साथ (हालांकि एक स्वीकार नहीं किया गया है): cp -r /path/to/source/. /destination
फ्लोरियन

जवाबों:


202

आप UNIX & Linux के उत्तर में इस पर समाधान का एक व्यापक सेट पा सकते हैं कि आप सभी फ़ाइलों (छिपी सहित) को एक निर्देशिका से दूसरी में कैसे स्थानांतरित करते हैं? । यह बाश, zsh, ksh93, मानक (POSIX) श, आदि में समाधान दिखाता है।


आप इन दोनों आदेशों का एक साथ उपयोग कर सकते हैं:

mv /path/subfolder/* /path/   # your current approach
mv /path/subfolder/.* /path/  # this one for hidden files

या सभी एक साथ ( धन्यवाद pfnuesel ):

mv /path/subfolder/{.,}* /path/

जिसका विस्तार है:

mv /path/subfolder/* /path/subfolder/.* /path/

(उदाहरण: echo a{.,}bविस्तार a.b ab)

ध्यान दें कि यह चेतावनी के एक जोड़े को दिखाएगा:

mv: cannot move ‘/path/subfolder/.’ to /path/.’: Device or resource busy
mv: cannot remove /path/subfolder/..’: Is a directory

बस उन्हें अनदेखा करें: ऐसा इसलिए होता है क्योंकि /path/subfolder/{.,}*यह भी विस्तारित होता है /path/subfolder/.और /path/subfolder/.., जो निर्देशिका और मूल निर्देशिका हैं (देखें "क्या करते हैं" और ".." का अर्थ है जब एक फ़ोल्डर में? )।


यदि आप कॉपी करना चाहते हैं, तो आप एक मात्र का उपयोग कर सकते हैं:

cp -r /path/subfolder/. /path/
#                     ^
#                     note the dot!

यह सभी फाइलों को कॉपी करेगा, जो सामान्य और छिपे हुए दोनों हैं, क्योंकि /path/subfolder/."इस निर्देशिका से सब कुछ" का विस्तार होता है (स्रोत: छिपी हुई फ़ाइलों और छिपी निर्देशिकाओं और उनकी सामग्री को शामिल करने के लिए cp के साथ कैसे कॉपी करें? )


2
ब्रेसिज़ केवल एक छोटी कट के लिए हैं mv /path/subfolder/* /path/subfolder/.* /path/, दो आदेशों को एक में संयोजित करने के लिए कड़ाई से आवश्यक नहीं है।
chepner

7
मुझे निम्नलिखित त्रुटि मिलती है:mv: overwrite `/path/.'? y mv: cannot move `/path/subfolder/.' to `/path/.': Device or resource busy mv: overwrite `/path/..'? y mv: cannot move `/path/subfolder/..' to `/path/..': Device or resource busy
देजन

@Dejan बस इसे अनदेखा करें। .वर्तमान निर्देशिका को ..दर्शाता है और निर्देशिका को दर्शाता है up। आपने देखा होगा कि अन्य सभी फाइलें स्थानांतरित हो जाती हैं।
देबिप्रसाद

यह उल्लेख करते हुए कि ब्रेसेस शॉर्टकट सभी गोले के लिए काम नहीं करेगा, लेकिन @chepner कमांड मुझे लगता है कि यह होगा
करेरा

7
"बस चेतावनी को अनदेखा करें" हमेशा एक अच्छा विचार नहीं हो सकता है। अभी मुझे एक स्क्रिप्ट में समस्या हो रही है जिसमें मुझे निष्पादन को रोकने की आवश्यकता है यदि कोई भी कदम विफल हो जाता है - चूंकि यह समाधान हमेशा एक त्रुटि का कारण बनता है, यह मेरी स्क्रिप्ट को मारता है। मुझे यह निर्धारित करने के लिए एक तरीके की आवश्यकता है कि एमवी कमांड विफल हुआ या नहीं ...
मारियोविलास

29

मुझे लगता है कि यह सबसे सुरुचिपूर्ण है, क्योंकि यह भी स्थानांतरित करने की कोशिश नहीं करता है ..:

mv /source/path/{.[!.],}* /destination/path

1
हाँ, मैंने देखा कि यह उन त्रुटि संदेशों को भी दे रहा है, अच्छा लगता है।
जोसेफ एस्ट्राहन

मुझे लगता है कि यह एक बहुत अच्छा समाधान है, लेकिन उस पैटर्न को याद रखना कठिन है
डायलन बी

यह फ़ाइलों को याद करेगा जैसे ..anythingया ...anythingआदि - stackoverflow.com/a/31438355/2351568 में इस समस्या के लिए सही rexx शामिल है। || लेकिन वैसे भी उपयोग shopt -s dotglobअभी भी बेहतर समाधान है!
डीजे क्रशडम्मी

@DylanB इसे याद नहीं करते। याद रखें कि यह घुंघराले में जो कुछ भी है, कॉमा से अलग होकर मेल खाता है। {a,b}*"एनाटॉमी" और "बुलडोजर" जैसी सभी फाइलें शुरू करेगा। दूसरा मैच सिर्फ एक खाली मैच है, जिसके बराबर है *, और पहला मैच इसके बराबर है .[!.], जहां समूह का [!.]अर्थ है समूह जिसमें ए की शुरुआत नहीं है .। इसका मतलब है .*लेकिन नहीं ..*
mazunki

28

यह सभी फाइलों को पेरेंट डायरेक्टरी की ओर ले जाएगा, जैसी कि उम्मीद की जा रही है, लेकिन छिपी हुई फाइल्स को मूव नहीं करेगा। उसको कैसे करे?

आप चालू कर सकते हैं dotglob:

shopt -s dotglob               # This would cause mv below to match hidden files
mv /path/subfolder/* /path/

बंद करने के लिए dotglob, आपको यह कहना होगा:

shopt -u dotglob

बहुत मददगार। अधिक पता लगाना चाहता था लेकिन दुकान एक बिलिन है इसलिए man shoptकाम नहीं करता है और help shoptबहुत संक्षिप्त है। लेकिन आप कर सकते हैं bashman () { man bash | less -p "^ $1 "; }और फिर bashman shoptसीधे इसके बारे में सब पढ़ने के लिए। (अगर मुझे शोपिंग से शुरू होने वाली लाइनें हैं, तो कमांड में नीचे जाने के लिए एन को हिट करना पड़ सकता है, जैसा कि मैंने पाया।)
निक राइस

2
यह भी अन्य सभी आदेशों को प्रभावित करेगा जैसे ls.. इस प्रकार वास्तव में आप क्या चाहते हैं, शायद नहीं
phil294

5

वैकल्पिक सरल उपाय rsyncउपयोगिता का उपयोग करना है:

sudo rsync -vuar --delete-after --dry-run path/subfolder/ path/

नोट: ऊपर का कमांड दिखाएगा कि क्या बदलने वाला है। वास्तविक परिवर्तनों को निष्पादित करने के लिए, हटा दें--dry-run

लाभ यह है कि मूल फ़ोल्डर ( subfolder) कमांड के हिस्से के साथ ही हटा दिया जाएगा, और mvयहां उदाहरणों का उपयोग करते समय आपको अभी भी अपने फ़ोल्डरों को साफ करने की आवश्यकता है, एक ही में छिपी और गैर-छिपी हुई फ़ाइलों को कवर करने के लिए अतिरिक्त सिरदर्द का उल्लेख नहीं करने के लिए। पैटर्न।

इसके अलावा rsync, रीमोट के बीच फ़ाइलों को कॉपी / मूविंग करने का समर्थन प्रदान करता है और यह सुनिश्चित करता है कि फाइलें बिल्कुल उसी तरह कॉपी की जाती हैं जैसे वे मूल रूप से ( -a) थे ।

प्रयुक्त -uपैरामीटर मौजूदा नई फ़ाइलों को छोड़ देगा, -rनिर्देशिकाओं में पुनरावृत्ति -vकरेगा और वर्बोसिटी बढ़ाएगा।


सबसे अच्छा समाधान कभी! मेरे मामले में मैंने सिर्फ -u पैरामीटर को हटा दिया है, क्योंकि मैं रूट फ़ोल्डर को अपडेट नहीं करना चाहूंगा। धन्यवाद
थेल्स Ceolin

यह उन आदेशों में से एक है जहां यदि आप सावधान नहीं हैं, तो आप वास्तव में स्थायी रूप से अपने लिए चीजों को गड़बड़ कर सकते हैं। कृपया rsync कमांड से पहले sudo को शामिल करने के लिए अपने उत्तर को अपडेट करें, अन्यथा, उपयोगकर्ता आसानी से mkdir के लिए अनुमति अस्वीकृत कर सकते हैं, लेकिन फ़ाइल विलोपन फिर भी आगे बढ़ेंगे, इस प्रकार, rsync कमांड आपके द्वारा स्थानांतरित की गई पूरी निर्देशिका को हटा देगा, और कुछ नहीं करें । आप अपनी पूरी निर्देशिका खो देंगे। एक बार जब आप अपने उत्तर में सूडो जोड़ते हैं, तो यह संभवतः स्वीकृत उत्तर होना चाहिए। तो कमांड होना चाहिए: sudo rsync -vuar --delete-after path / subfolder / path /
ब्लू वाटर

@JohnnyB असुविधा के बारे में क्षमा करें। मैंने जोड़ा है sudoऔर --dry-runइसलिए, लोग किसी भी संभावित गड़बड़ी से बचने के लिए वास्तविक कमांड चलाने से पहले परिवर्तनों का परीक्षण कर सकते हैं।
kenorb

ओह, मुझे नहीं पता था कि एक --dry- रन विकल्प था। अच्छा जोड़। माफी की कोई जरूरत नहीं। यह उत्कृष्ट है।
ब्लू वाटर

3

मैं आपको अपने दोस्त "डॉटग्लोब" से मिलवाता हूँ। यह चालू और बंद है या नहीं "*" में छिपी हुई फाइलें शामिल हैं।

$ mkdir test
$ cd test
$ touch a b c .hidden .hi .den
$ ls -a
. ..  .den  .hi .hidden a b c

$ shopt -u dotglob
$ ls *
a b c
$ for i in * ; do echo I found: $i ; done
I found: a
I found: b
I found: c

$ shopt -s dotglob
$ ls *
.den  .hi .hidden a b c
$ for i in * ; do echo I found: $i ; done
I found: .den
I found: .hi
I found: .hidden
I found: a
I found: b
I found: c

यह "बंद" करने के लिए चूक करता है।

$ shopt dotglob
dotglob         off

जब आप कर रहे हों तो इसे वापस चालू करना सबसे अच्छा है अन्यथा आप उन चीजों को भ्रमित कर देंगे जो यह मानते हैं कि यह बंद हो जाएगा।


3

का उपयोग करके findके साथ संयोजन के रूप में आदेश mvआदेश, आप को रोका जा सकता mvनिर्देशिका (जैसे स्थानांतरित करने के लिए कोशिश कर रहा से आदेश ..और .) और उप निर्देशिकाओं। यहाँ एक विकल्प है:

find /path/subfolder -maxdepth 1 -type f -name '*' -exec mv -n {} /path \;

प्रदान किए गए कुछ अन्य उत्तरों के साथ समस्याएं हैं। उदाहरण के लिए, निम्न में से प्रत्येक स्रोत पथ से उपनिर्देशिका को स्थानांतरित करने का प्रयास करेगा:

1) mv /path/subfolder/* /path/ ; mv /path/subfolder/.* /path/
2) mv /path/subfolder/{.,}* /path/ 
3) mv /source/path/{.[!.],}* /destination/path

इसके अलावा, 2) शामिल हैं। और .. फाइलें और 3) फाइलों को याद करती हैं जैसे ..ऑफोबार, ... बारफू, आदि।

आप उपयोग कर सकते हैं, mv /source/path/{.[!.],..?,}* /destination/pathजिसमें 3 से छूटी हुई फाइलें शामिल होंगी), लेकिन यह अभी भी उपनिर्देशिका को स्थानांतरित करने का प्रयास करेगा। findकमांड के साथ कमांड का उपयोग करना mvजैसा कि मैं ऊपर वर्णित करता हूं इन सभी समस्याओं को समाप्त करता है।


2

इस समस्या के लिए मेरा समाधान जब मुझे सभी फाइलों ( .फाइलों सहित ) को एक लक्ष्य निर्देशिका में कॉपी करना है, तो अनुमतियों को बरकरार रखना है: (पहले से मौजूद होने पर अधिलेखित करें)

yes | cp -rvp /source/directory /destination/directory/

yesस्वचालित रूप से गंतव्य फ़ाइलों को अधिलेखित करने के लिए है, rपुनरावर्ती, vक्रिया, pअनुमतियाँ बनाए रखें।

ध्यान दें कि स्रोत पथ एक के साथ समाप्त नहीं हो रहा है/ (इसलिए सभी फ़ाइलें / निर्देशिका और फ़ाइलें कॉपी की गई हैं)

गंतव्य निर्देशिका समाप्त हो जाती है/ क्योंकि हम स्रोत फ़ोल्डर की सामग्री को पूरे गंतव्य के रूप में रख रहे हैं।


जबकि yesअगर आप गंतव्य फ़ाइलों ओवरराइड करना चाहते का उपयोग करने के एक भयानक आदेश है, हमेशा वांछित नहीं है कि। यदि आप सुनिश्चित हैं कि आप ऐसा करना चाहते हैं तो ही इसका उपयोग करें। भी, वहाँ yes | cp ...और के बीच एक अंतर है cp -f ...?
mazunki
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.