जवाबों:
डिस्क्लेमर: यह उत्तर विशेष रूप से बैश से संबंधित है, लेकिन यह बहुत ग्लोब पैटर्न के बारे में सवाल पर लागू होता है!
स्टार चरित्र ( *
) एक वाइल्डकार्ड है। वर्णों का एक निश्चित समूह है कि यह जगह लेगा और पहला वर्ण एक बिंदु ( .
) है उनमें से एक नहीं है। यह एक विशेष मामला है क्योंकि यूनिक्स फाइल सिस्टम कैसे काम करता है, एक डॉट के साथ शुरू होने वाली फाइलों को "छिपा हुआ" माना जाता है। यही कारण है कि इस तरह के रूप उपकरण है कि इसका मतलब है cp
, ls
आदि नहीं उन्हें "देख" होगा जब तक कि स्पष्ट रूप से ऐसा करने के लिए कहा था।
पहले कुछ नमूना डेटा बनाते हैं।
$ mkdir .dotdir{1,2} regdir{1,2}
$ touch .dotfile{1,2} regfile{1..3}
तो अब हमारे पास निम्नलिखित हैं:
$ tree -a
.
|-- .dotdir1
|-- .dotdir2
|-- .dotfile1
|-- .dotfile2
|-- regdir1
|-- regdir2
|-- regfile1
|-- regfile2
`-- regfile3
अब कुछ खेल खेलते हैं। आप कमांड echo
का उपयोग यह बताने के लिए कर सकते हैं कि एक विशेष वाइल्डकार्ड क्या है ( *
) इस तरह दिए गए कमांड के लिए होगा:
$ echo *
regdir1 regdir2 regfile1 regfile2 regfile3
$ echo reg*
regdir1 regdir2 regfile1 regfile2 regfile3
$ echo .*
. .. .dotdir1 .dotdir2 .dotfile1 .dotfile2
$ echo .* *
. .. .dotdir1 .dotdir2 .dotfile1 .dotfile2 regdir1 regdir2 regfile1 regfile2 regfile3
$ echo .dotdir*
.dotdir1 .dotdir2
आप कमांड shopt -s dotglob
का उपयोग करने के लिए व्यवहार को बदल सकते हैं *
ताकि फाइलों के अलावा regfile1
यह भी मेल खाएगा .dotfile1
।
bash
मैन पेज से अंश
dotglob If set, bash includes filenames beginning with a `.' in the results
of pathname expansion.
उदाहरण:
$ shopt -s dotglob
$ echo *
.dotdir1 .dotdir2 .dotfile1 .dotfile2 regdir1 regdir2 regfile1 regfile2 regfile3
आप इस आदेश के साथ इस व्यवहार को वापस कर सकते हैं:
$ shopt -u dotglob
$ echo *
regdir1 regdir2 regfile1 regfile2 regfile3
आपके लिए आप बता रहे हैं cp
कि आप उन सभी फाइलों को कॉपी करना चाहते हैं जो पैटर्न से मेल खाती हैं *
, और कोई भी फाइल नहीं है।
$ cp foo/.* .
या आप यह कर सकते हैं यदि आप foo
फ़ोल्डर में सब कुछ चाहते हैं :
$ cp foo .
या आप स्पष्ट हो सकते हैं:
$ cp foot/.* foo/* .
ब्रेस विस्तार का उपयोग करके एक अधिक कॉम्पैक्ट रूप bash
:
$ cp foo/{.,}* .
किसी भी समय आप echo
अपने प्रस्तावित फ़ाइल पैटर्न को देखने के लिए ट्रिक का उपयोग कर सकते हैं (यह स्टार के लिए फैंसी शब्द है)।
$ echo {.,}*
. .. .dotdir1 .dotdir2 .dotfile1 .dotfile2 abc regdir1 regdir2 regfile1 regfile2 regfile3
संयोग से यदि आप फ़ाइलों की निर्देशिका + अन्य निर्देशिकाओं की प्रतिलिपि बनाने जा रहे हैं, तो आप आमतौर पर इसे पुनरावर्ती रूप से करना चाहते हैं, यह -R
स्विच है cp
:
$ cp -R foo/. .
shopt -s dotglob
, echo *
तो देता है:.dotdir1 .dotdir2 .dotfile1 .dotfile2 regdir1 regdir2 regfile1 regfile2 regfile3
cp -r foo .
के बाद से आम तौर पर काम नहीं करेगा cp
कॉपी करने के लिए मना कर देगा foo
पर ही, तो आप शायद मतलब cp -R foo/. .
। (ध्यान दें कि cp -R
मानक एक है)।
zsh
शामिल नहीं है । में , अगर एक पैटर्न से मेल नहीं खाता, आदेश निरस्त किया गया है (काफी समझदारी से फिर से), इसलिए सामान्य मामले में, हो, तो कोई छिपा या कोई गैर छिपा फ़ाइलों असफल हो जायेगी। .
..
.*
zsh
cp foo/{,.}* .
shopt
मौजूद नहीं है।
के साथ zsh
, विशिष्ट तरीका यह है कि D
ग्लोब क्वालिफायर ([डी] ओटी फाइलों को शामिल करने के लिए) का उपयोग किया जाए:
cp foo/*(D) .
ध्यान दें कि के साथ या बिना D
, zsh globs शामिल कभी नहीं .
है और न ही ..
(जैसा कि आप उम्मीद थी)।
शेल उन फ़ाइलों को छिपा हुआ मान रहा है जब वह *
वर्ण को हल करता है , इसलिए cp
इनमें से कोई भी फ़ाइल नाम तर्क के रूप में प्राप्त नहीं करता है।
आप उन्हें स्पष्ट रूप से निर्दिष्ट करके कॉपी कर सकते हैं cp foo/.* .
यदि आप जो करना चाहते हैं वह सभी फाइलों और निर्देशिकाओं को एक स्थान से दूसरे स्थान पर कॉपी करना है, तो आप मानक rsync
कमांड का उपयोग कर सकते हैं । ऊपर दिए गए उदाहरण में:
mkdir foo && touch foo/.test
rsync -a foo/ .
foo
वर्तमान निर्देशिका में छिपी हुई फ़ाइलों और छिपी निर्देशिकाओं सहित, की सभी सामग्रियों की पुनरावृत्ति करेगा । के अंत में अनुगामी स्लैश foo/
rsync के लिए महत्वपूर्ण है; इसके साथ केवल सामग्री की foo
नकल की जाती है, इसके बिना rsync की भी नकल होगी foo
। उदाहरण के लिए:-
mkdir src && mkdir dest && touch src/.test
rsync -a src dest // copies 'src' contents to 'dest/src'
rsync -a src/ dest // copies 'src' contents to 'dest'
मशीनों के बीच नकल सहित कई अन्य विकल्प उपलब्ध हैं।
dotglob
को zshglobdots
द्वारा अनुवादित किया जाता है जो कि बैश के लिए अमान्य विकल्प नाम है ।