2009-10-19 13 views
10

मैं समझता हूं कि वाइल्डकार्ड * (स्वयं द्वारा) इस तरह से विस्तारित होगा कि इसका मतलब है कि "वर्तमान फ़ोल्डर में सभी गैर-छिपी हुई फाइलें" छिपी हुई फाइलों के साथ एक अवधि के द्वारा उपसर्ग की गई हैं।बैश ग्लोबिंग - कुछ विशिष्ट मामलों के लिए autoexpand?

दो उपयोग के मामलों है कि मुझे लगता है कि होगा उपयोगी होते हैं कर रहे हैं, लेकिन मैं कैसे ठीक करने के लिए पता नहीं है:

  1. कैसे आप वर्तमान फ़ोल्डर में के लिए ... "सभी फ़ाइलें glob कर सकते हैं, छिपी हुई फाइलों सहित, लेकिन . या .. सहित "?

  2. आप कैसे चालू कर सकते हैं ... "वर्तमान फ़ोल्डर में सभी छिपी हुई फाइलें (और केवल छिपी हुई फाइलें), लेकिन . या .. सहित"?

उत्तर

15

paviums answer पर विस्तार करने और अपने प्रश्न के दूसरे भाग का जवाब करने के लिए, . और .. को छोड़कर सभी फाइलों को इस तरह निर्दिष्ट किया जा सकता है:

{.[!.]*,*} 

अपने सटीक उपयोग के मामले के आधार पर यह बेहतर हो सकता है dotglob स्थापित करने के लिए खोल विकल्प है, ताकि पार्टी डिफ़ॉल्ट रूप से * के विस्तार में dotfiles में शामिल हैं:

$ shopt -s dotglob 
$ echo * 
.tst 
+2

'{..? *, [^।] *, [^।] *}' 'Dotglob' सेटिंग के बावजूद काम करता है और दो बिंदुओं से शुरू होने वाले गायब फ़ाइल नामों से बचाता है, जो यहां हर कोई याद आती है। – ephemient

+1

@ephemient: यह मुझे एक नकली मैच देता है .. .. * * जब दो बिंदुओं से शुरू कोई फ़ाइल नाम नहीं है। –

3

Bash Cookbook आपकी दूसरी आवश्यकता का समाधान सुझाता है।

.[!.]* 

'डॉट फ़ाइलें' को निर्दिष्ट लेकिन . और ..

बेशक

से बचने का एक तरीका के रूप में, ls-A का विकल्प है, लेकिन वह ग्लोबिंग नहीं है।

+2

'स्पर्श ..blah; गूंज {।,} [!।] * | grep blah' असफल। – ephemient

1

अपने पहले मामले पूरा करने के लिए:

echo {.,}[^.]* 

या

echo {.,}[!.]* 

संपादित:

यह एक सब कुछ प्राप्त करने के लिए लगता है, लेकिन छोटे से ephemient के

echo {.*,}[^.]* 
+2

'स्पर्श ..blah; गूंज {।,} [^।] * | grep blah' असफल। – ephemient

0

है द्वारा "सभी फाइलों" और "सभी छिपी हुई फाइलें" क्या आप केवल फाइलों का मतलब रखते हैं, या आप दोनों का मतलब है f आईल्स और निर्देशिकाएं? Globbing किसी भी फ़ाइल या निर्देशिका से संबंधित होने पर नामों पर काम करता है। अन्य लोग छुपे हुए बनाम गैर-छिपा नाम खोजने के लिए ग्लोबिंग का उपयोग करने के लिए अच्छे उत्तर देते हैं, लेकिन आप find कमांड को एक आसान विकल्प के रूप में बदलना चाहते हैं जो कि प्रकारों के बीच अंतर कर सकता है।

"वर्तमान फ़ोल्डर में सभी फ़ाइलें, छिपे हुए फ़ाइलें शामिल हैं, लेकिन सहित नहीं या ..।" ढूंढने के लिए:

find . -type f 

"वर्तमान फ़ोल्डर में खोजने के लिए सभी फ़ाइलें और निर्देशिका छिपी हुई फ़ाइलें शामिल है, लेकिन शामिल नहीं है या ..":

find . ! -name . 

" वर्तमान फ़ोल्डर में सभी छिपी हुई फ़ाइलें (और केवल छिपी हुई फाइलें) ढूंढने के लिए, लेकिन इसमें शामिल नहीं है। या ..: वर्तमान फ़ोल्डर में सभी छिपी हुई फ़ाइलें और निर्देशिका (और केवल छिपी हुई फ़ाइलें और निर्देशिका), लेकिन सहित नहीं "

find . -name '.*' -type f 

ढूंढने के लिए"। या .. ":

find . -name '.*' ! -name . 

ध्यान दें कि डिफ़ॉल्ट रूप से खोज भी, उप निर्देशिकाओं के माध्यम से recurse होगा, इसलिए यदि आप केवल वर्तमान डायरेक्टरी में सीमित करना चाहते हैं तो आप उपयोग कर सकते हैं:

find . -maxdepth 1 -type f 
1

sth संयोजन और pavium

# dot files but avoiding . and .. 
.[!.]* 

# all files but avoiding . and .. 
{.[!.]*,*} 
0

उत्तर देता है तो, भले ही यह पुराना है - shopt का उपयोग किए बिना, यह क्या जवाब के रूप में दिया गया है पर विस्तार, पूरी तरह से जवाब दिया गया है प्रतीत नहीं होता है लेकिन अब तक, मेरे लिए इन काम:।

1:

{*,.[!.]*,..?*}

2:

{.[!.]*,..?*}