मैं छुपी हुई फ़ाइलों को स्थानांतरित करने के लिए mv (या * वाइल्डकार्ड) कैसे प्राप्त कर सकता हूं?


133

मैं अपने होम डाइरेक्टरी को एक पुराने सिस्टम से एक नए में माइग्रेट कर रहा हूं, और मैंने जो टार्बॉल बनाया है, उसमें .bashrc जैसी छिपी हुई फाइलें शामिल हैं। हालाँकि, जब मैं अपने नए होम डायरेक्टरी में अनपैक्ड टारबॉल (जो / / tmp में हैं) की सामग्री को स्थानांतरित करता हूं, तो छिपी हुई फाइलें कॉपी नहीं होती हैं ( mv /tmp/home/rcook/* /home/rcook/)। मैं उन्हें स्थानांतरित करने के लिए एमवी कैसे प्राप्त कर सकता हूं?

वास्तव में, मुझे लगता है कि समस्या एमवी के साथ नहीं है, लेकिन बैश के ग्लोबिंग के साथ है। अगर मैं ऐसा करता हूं:

mkdir a
mkdir b
touch a/.foo
touch a/bar
mv a/* b/
ls -a a/ b/

मैंने यह देखा:

a/:
.  ..  .foo

b/:
.  ..  bar

a/.fooनहीं हिला। तो मैं छिपी हुई फाइलों को खोजने के लिए * वाइल्डकार्ड कैसे प्राप्त कर सकता हूं?

हां, मुझे लगता है कि मैं तारकोल को सीधे अपने होम डायरेक्टरी में डीकंप्रेस कर सकता हूं, लेकिन टेरबॉल में गिरावट आती है home/rcook/..., और मैं यह सुनिश्चित करना चाहता हूं कि मैं .bashrcपुराने, कस्टमाइज्ड वर्जन और छिपे हुए फाइल्स को खोजने और स्थानांतरित करने के लिए नए आदि को लिखूं। एक योग्य कौशल है। सुझाव?


कुछ जवाब कुछ ऐसा करने का सुझाव देते हैं mv src/.* dest/। हालांकि, मैंने अपने परीक्षण निर्देशिकाओं पर यह कोशिश की और त्रुटियों को मिला। के साथ शुरू:

rcook$ ls -a a/ b/
a/:
.  ..  bar  .foo

b/:
.  ..
rcook$ mv a/.* b/
mv: cannot move 'a/.' to 'b/.': Device or resource busy
mv: cannot remove 'a/..': Is a directory
rcook$ ls -a a/ b/
a/:
.  ..  bar

b/:
.  ..  .foo

मैं क्या गलत कर रहा हूं?


जवाबों:


146

तुम यह केर सकते हो :

shopt -s dotglob
mv /tmp/home/rcook/* /home/rcook/

आप रख सकते हैं

shopt -s dotglob

अपने में ~/.bashrcआप इसे डिफ़ॉल्ट होना चाहते हैं।

Http://mywiki.wooledge.org/glob देखें


डॉट फ़ाइलों को कॉपी करने के लिए एक और तरीका:

mv /tmp/home/rcook/.[!.]* /home/rcook/

पैटर्न का उपयोग न करें ..*क्योंकि यह मेल खाता है ..(मूल निर्देशिका के लिए सूचक)। यदि ऐसी फाइलें हैं जिनका नाम दो डॉट्स ( ..something) के साथ शुरू होता है , तो पैटर्न का भी उपयोग करें ..?*


कृपया मेरे प्रश्न के निचले भाग में जोड़े गए योगों को देखें। धन्यवाद।
रान्डेल कुक

1
Nothings गलत हैं, .और ..विशेष dirs हैं: क्रमशः वर्तमान dir और मूल dir । यह सिर्फ एक चेतावनी है। बेहतर उपयोग shopt -s dotglobसमाधान
गिल्स क्वेनोट

मैंने दो चालें करते हुए समाप्त mv home/rcook/* /home/rcook/किया : उसके बाद mv home/rcook/.* /home/rcook/। यह चाल चली, हालांकि मैं चाहता हूं कि मैंने लिंक का अनुसरण किया था और पहले डॉटग्लोब मोड के बारे में पढ़ा। इसने मुझे एक कदम बचाया होगा। +1
रान्डेल कुक

तो दूसरे दृष्टिकोण को निरपेक्ष पथों के उपयोग की आवश्यकता है?
फ्रेंगलोरेंजोन

3
आप उपयोग कर रहे हैं zsh, तो आप उपयोग कर सकते हैं ग्लोबिंग क्वालीफायर या खोल विकल्पDGLOB_DOTS
मंगल

43

आपके अतिरिक्त में, आपको त्रुटियां मिलीं, लेकिन कोड ने अभी भी काम किया है। जोड़ने के लिए केवल यह है कि आपने इसे केवल डॉट फ़ाइलों को कॉपी करने के लिए कहा था । प्रयत्न, कोशिश:

mv src/* src/.* dst/

आप अभी भी त्रुटियों के लिए मिल जाएगा। और .. प्रविष्टियाँ, जो ठीक है। लेकिन कदम सफल होना चाहिए।

~/scratch [andrew] $ mv from/* from/.* to/
mv: cannot move from/.’ to to/.’: Device or resource busy
mv: cannot remove from/..’: Is a directory
~/scratch [andrew] $ ls -a from/ to/
from/:
.  ..

to/:
.  ..  test  .test

1
अच्छे अंक, @AndrewSchwartz। मुझे भी यह तरीका पसंद है। मुझे लगता है कि यह अधिक मान्यता के योग्य है।
रान्डेल कुक

मुझे पसंद है @Drake क्लेरिस थोड़ा और जवाब दें, क्योंकि मैं अमेज़ॅन AWS कोडबील पर चल रहा हूं और गैर शून्य रिटर्न कोड वास्तव में मेरे निर्माण को रोक देता है। मैंने .hiddenअपनी समस्या को हल करने के लिए स्पष्ट रूप से एक फ़ाइल को स्थानांतरित कर दिया था।
हेवचट

यदि गैर-शून्य निकास कोड एक समस्या है जिसे आप इसे दबा सकते हैं, उदाहरण के लिए जोड़कर || :( ||इसका मतलब है कि झूठी / त्रुटि पर निम्नलिखित निष्पादित करें, :तो कोई आदेश नहीं है)। लेकिन यह कानूनी त्रुटियों को भी दबा देगा, उदाहरण के लिए गंतव्य फ़ोल्डर मौजूद नहीं है। मैं और प्रविष्टियों mvको बाहर करने के लिए एक और अधिक सुंदर तरीका नहीं खोज सकता । बट पर मेरे लिए बट प्लस प्लस डिस्क पर नई फाइलें नहीं लिख रहा है। ...
एंड्रयू श्वार्ट्ज

10

यदि आप ls -lएक निर्देशिका में हैं, तो आप देखेंगे .और ..सूचीबद्ध फ़ाइलों के बीच। इसलिए, मुझे लगता mv .* /destहै कि उन बिंदुओं को ध्यान में रखा गया है। प्रयत्न, कोशिश:

mv /tmp/home/rcook/{*,.[^.]*,..?*} /home/rcook/

यह उन वर्तमान और मूल dir संकेतकर्ताओं को अनदेखा करेगा।

यदि कोई तीन पैटर्न *, [^.]*या ..?*बिना फ़ाइल से मेल खाता है, तो आपको एक त्रुटि मिलेगी , इसलिए आपको केवल उसी मिलान को शामिल करना चाहिए।


अच्छा लगा। ग्लोबिंग की इस शैली का एक समान उत्तर यहां है: superuser.com/a/784046/144977 । इसे पोस्ट करने के लिए धन्यवाद।
phyatt

7

दो संभावित समाधान जो मैं सोच सकता हूं। पहले अपने पुनरावर्ती विकल्प के साथ cp का उपयोग करना है, वर्तमान निर्देशिका को गंतव्य पर कॉपी करना है।

cp -Rp . /desired/directory

तब आप वर्तमान निर्देशिका में स्रोत फ़ाइलों को हटा सकते हैं

वैकल्पिक रूप से, यदि आप जानते हैं कि फाइलें नामांकित हैं (कोई रिक्त स्थान, वाइल्डकार्ड, गैर-मुद्रण योग्य वर्ण नहीं), तो आप इसके लिए कुछ कर सकते हैं

mv $(ls -A) /desired/directory

4
यदि स्रोत और लक्ष्य एक ही फाइल सिस्टम पर हैं, तो कॉपी-फिर-हटाएं चाल से बहुत अलग हैं। कम से कम -pमेटाडेटा को संरक्षित करने का विकल्प शामिल करें । उपयोग lsकरना एक अंतिम उपाय होना चाहिए, और यहां बेहतर, सरल तरीके हैं।
गिल्स

2

वास्तव में लिनक्स पर "छिपी" फ़ाइलों के रूप में ऐसी कोई चीज नहीं है। फाइलें जो डॉट के साथ शुरू होती हैं, वे डिफ़ॉल्ट रूप से फाइल लिस्टिंग से छिपी होती हैं।

एक ग्लोब के साथ भी फ़ाइलों को कॉपी करने के लिए, आपको फ़ाइल को .इस तरह से उपसर्ग करना होगा mv -u .* fooऔर फिर स्थानांतरित होने पर .fooappearn होगा foo/.foo

-U विकल्प केवल फाइलों को स्थानांतरित करेगा जब स्रोत नया है, या गंतव्य गायब है। या आप केवल स्थानांतरित करने के बारे में त्रुटियों को अनदेखा कर सकते हैं .और ..जैसा कि वे विशेष फाइलें हैं और उन्हें स्थानांतरित नहीं किया जा सकता है, लेकिन .*शेल द्वारा गोला में पकड़ा जाता है।


कृपया मेरे प्रश्न के निचले भाग में जोड़े गए योगों को देखें। धन्यवाद।
रान्डेल कुक

0

तो हमारे पास:

a
|-- .foo
`-- bar

तथा:

b

मुझे यहां सभी उत्तरों की तुलना में बेहतर समाधान खोजने में बहुत समय लगा।

फिर मैंने इस कमांड के लिए 30 सेकंड का समय लिया :

$ mv --help

तब मुझे अपना प्यार मिला:

$ mv a/ b/ -T

नोट: मुझे भी तर्क समझ में नहीं आता है -T। यह सिर्फ वही हुआ जो मुझे चाहिए था। यहाँ यह कहता है:

-T, - नहीं-लक्ष्य-निर्देशिका DEST को एक सामान्य फ़ाइल के रूप में मानते हैं


1
यदि आप स्लैश छोड़ देते हैं, तो आपको आवश्यकता नहीं होनी चाहिए -T। किसी भी तरह से यह अनिवार्य रूप से एमवी को निर्देशिका को स्थानांतरित करने के लिए कह रहा है, बजाय इसके अंदर से सभी फाइलों को स्थानांतरित करने के।
थोमसट्रेटर

@thomasrutter, निर्देशिका को उसी नाम पर स्थानांतरित नहीं कर रहा है, जिसका नाम बदल रहा है?
रान्डेल कुक

3
हां, यदि मूल गंतव्य समान है, तो अनिवार्य रूप से इसका नाम बदल दिया जा रहा है। हालाँकि आप इसका उल्लेख करते हैं, यह संभवतः मूल प्रश्न का उत्तर देने में मदद नहीं करता है, जो निर्देशिका के अंदर फ़ाइलों को दिए गए स्थान में स्थानांतरित करने के बारे में था ।
थोमसट्रेटर

0

मेरे मामले में मैं केवल mvएक छिपी हुई फ़ाइल की कोशिश कर रहा था और यह समाधान था:

FILE=.myHiddenFile
mv "$FILE" dest/

व्याख्या

सबसे पहले मैं कोशिश कर रहा था:

mv .myHiddenFile dest/

लेकिन यह त्रुटि पैदा करता रहा:

mv: cannot stat '.myHiddenFile': No such file or directory

हालांकि यह ls -alदिखाया गया है कि फ़ाइल और dest/अस्तित्व में है।

कारण प्रतीत होता है क्योंकि शेल "व्याख्या" कर रहा था। फ़ाइल नाम में, इसलिए इसे एक चर पर ले जाने से यह व्याख्या से बचा जाता है। इसे हल करने के लिए शायद अन्य तरीके हैं, लेकिन यह हमारे लिए पर्याप्त था।


-1

यदि आप वर्तमान निर्देशिका में छिपी हुई फ़ाइलों सहित फ़ाइलों को कॉपी करना चाहते हैं।

cp -Rp source-directory/. .

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