एक वाइल्डकार्ड-एम्बेडेड "खोज" खोज में छिपी हुई फ़ाइलों और निर्देशिकाओं को कैसे बाहर निकालना / अनदेखा करना है?


119

"कुछ पाठ" से पहले और बाद वाइल्डकार्ड नोटिस करें

find . -type f -name '*some text*'

सभी छिपी हुई फ़ाइलों और निर्देशिकाओं को कैसे बाहर रखा / अनदेखा किया जा सकता है?

मैं पहले से ही बहुत लंबे समय के लिए गुगली कर रहा हूँ , कुछ-भर में आया और! (विस्मयादिबोधक चिह्न) पैरामीटर, लेकिन कोई फिटिंग (और पार्सिमोनियस) उदाहरण जो बस काम किया

पाइपिंग | के लिए grepएक विकल्प हो सकता है और मैं भी इस बात का उदाहरण का स्वागत करता हूँ; लेकिन मुख्य रूप से मैं एक संक्षिप्त एक लाइनर (या स्टैंड-अलोन एक-लाइनर्स के एक जोड़े, एक ही कमांड लाइन लक्ष्य को प्राप्त करने के विभिन्न तरीकों को दर्शाता हुआ) में दिलचस्पी रखता हूँ बस का उपयोग कर find

पीएस: लिनक्स में फाइलें ढूंढना और विशिष्ट निर्देशिकाओं को बाहर करना निकट से संबंधित लगता है, लेकिन ए) अभी तक स्वीकार नहीं किया गया है और बी) संबंधित-लेकिन-अलग-और-अलग है, लेकिन सी) प्रेरणा प्रदान कर सकती है और भ्रम को इंगित करने में मदद कर सकती है!

संपादित करें

find . \( ! -regex '.*/\..*' \) -type f -name "whatever", काम करता है। रेगेक्स "कुछ भी, फिर एक स्लैश, फिर एक डॉट, फिर कुछ भी" (यानी उनके सबफ़ोल्डर सहित सभी छिपी हुई फ़ाइलें और फ़ोल्डर्स), और "!" रेगेक्स को नकारता है।


आपके द्वारा संपादित किए गए कार्यों में मदद नहीं करता है, लेकिन मेरे प्रश्न और इसके उत्तर पर एक नज़र डालें: unix.stackexchange.com/q/69164/15760 और उत्तर में लिंक भी।

जवाबों:


134

यह उन सभी फ़ाइलों को प्रिंट करता है जो आपकी निर्देशिका के वंशज हैं, छिपी हुई फ़ाइलों और निर्देशिकाओं को छोड़ देती हैं:

find . -not -path '*/\.*'

इसलिए यदि आप some textइसके नाम वाली फ़ाइल की तलाश में हैं, और आप छिपी हुई फ़ाइलों और निर्देशिकाओं को छोड़ना चाहते हैं, तो चलाएं:

find . -not -path '*/\.*' -type f -name '*some text*'

स्पष्टीकरण:

-pathविकल्प की जाँच करता पूरे पथ स्ट्रिंग के खिलाफ एक पैटर्न चलाता है। *एक वाइल्डकार्ड है, /एक डायरेक्ट्री सेपरेटर है, \.एक डॉट है (इसे विशेष अर्थ से बचने के लिए बचना पड़ता है), और *अन्य वाइल्डकार्ड हैं। -notइस परीक्षण से मेल खाने वाली फ़ाइलों का चयन न करें।

मुझे नहीं लगता कि findपिछली कमांड में छिपी निर्देशिकाओं की खोज से बचने के लिए यह काफी स्मार्ट है, इसलिए यदि आपको गति की आवश्यकता है, तो -pruneइसके बजाय इसका उपयोग करें:

 find . -type d -path '*/\.*' -prune -o -not -name '.*' -type f -name '*some text*' -print

आखिरी के साथ ध्यान दें कि आपको -printआखिर में क्या चाहिए! इसके अलावा, निश्चित नहीं है कि अगर -name '\.*' would be more efficient instead of -पथ `(क्योंकि पथ सबपैथ खोज रहा है, लेकिन इनका पता चल जाएगा)
आर्टफ्लोरोबॉट

.इस संदर्भ में विशेष अर्थ क्या है?
frostschutz

@frostschutz डॉट के बाद findवर्तमान निर्देशिका का मतलब है: वर्तमान findनिर्देशिका के तहत सभी फ़ाइलों और निर्देशिकाओं को देखेंगे। इसके बाद pathका तर्क एक नियमित अभिव्यक्ति है, जहां एक डॉट का सामान्य रूप से "कोई भी चरित्र" होता है, इसका मतलब यह है कि शाब्दिक बिंदु का मतलब है कि हमें इसे बैकस्लैश के साथ बचना होगा। एक नियमित अभिव्यक्ति के बाद तर्क -name नहीं है, लेकिन यह वाइल्डकार्ड को खोल की तरह ?और फैलता *है।
फ्लिम्म

2
@frostschutz वास्तव में, यह सोचने के लिए आते हैं, मैं .विशेष अर्थ होने के बारे में गलत हो सकता है ।
13

1
@ फिलम यूप, भागने की जरूरत नहीं .। जहां तक मुझे पता है हूँ, केवल इन फरार हो जाने की जरूरत है: *, ?, और []
30

10

यह डॉट-फाइल को बाहर करने के कुछ साधनों में से एक है जो बीएसडी, मैक और लिनक्स पर भी सही तरीके से काम करता है:

find "$PWD" -name ".*" -prune -o -print
  • $PWD वर्तमान निर्देशिका के लिए पूर्ण पथ प्रिंट करें ताकि पथ के साथ शुरू न हो ./
  • -name ".*" -prune किसी भी फाइल या निर्देशिका से मेल खाता है जो डॉट से शुरू होता है और फिर नीचे नहीं उतरता
  • -o -printयदि पिछली अभिव्यक्ति कुछ भी मेल नहीं खाती है तो फ़ाइल नाम प्रिंट करें। डिफ़ॉल्ट रूप से प्रिंट नहीं करने के लिए अन्य सभी अभिव्यक्तियों का उपयोग करना -printया -print0उनका कारण बनता है।

कृपया "खतरनाक रूप से जटिल" पर व्याख्या / विस्तार करें; पहले से दिए गए उत्तर और आपका उत्तर इसके विपरीत होने का प्रमाण देता है ...?
नाइटी के बारे में अखरोट

2
"खतरनाक रूप से जटिल" शायद अत्यधिक है। मैंने बिंदु पर पहुंचने के लिए उत्तर दिया। मुझे लगता है कि मैंने जो उत्तर पोस्ट किया है, उसे समझना मुश्किल है और मैन पेज को बहुत सावधानीपूर्वक पढ़े बिना देखना मुश्किल है। यदि आप केवल जीएनयू खोज का उपयोग कर रहे हैं तो अधिक संभव समाधान हैं।
एरंडमैन

-o ... -printमददगार है। मेरे उपयोग के लिए, मेरे पास अब find ... '!' -name . -name '.*' -prune -o ... -print$ PWD शामिल करने की तुलना में अधिक सुविधाजनक था।
रोजर पाटे

4
find $DIR -not -path '*/\.*' -type f \( ! -iname ".*" \)

$ डीआईआर के तहत सभी छिपी निर्देशिकाओं और छिपी हुई फाइलों को छोड़ दें


यह एकदम सही जवाब है। यह पुन: सभी फ़ाइलों को ढूँढता है, लेकिन निर्देशिकाओं और छिपी हुई फ़ाइलों के लिए लाइन आइटम को बाहर करता है। धन्यवाद!
KyleFarris

2

इस सवाल का जवाब मैं मूल रूप से ऊपर अपने मूल प्रश्न का "संपादित करें" के रूप में तैनात:

find . \( ! -regex '.*/\..*' \) -type f -name "whatever", काम करता है। रेगेक्स "कुछ भी, फिर एक स्लैश, फिर एक डॉट, फिर कुछ भी" (यानी उनके सबफ़ोल्डर सहित सभी छिपी हुई फ़ाइलें और फ़ोल्डर्स), और "!" रेगेक्स को नकारता है।


इसी तरह, लेकिन केवल वर्तमान फ़ोल्डर के लिए:find . \( ! -regex './\..*' \) -type f -maxdepth 1 -print
phyatt

2

आपको उसके लिए उपयोग नहीं करना findहै। शेल में बस ग्लोबस्टार का उपयोग करें-स्व, जैसे:

echo **/*foo*

या:

ls **/*foo*

जहां **/किसी भी फ़ोल्डर का पुनरावर्ती रूप से प्रतिनिधित्व *foo*किया fooजाता है और उसके नाम पर कोई भी फ़ाइल होती है ।

डिफ़ॉल्ट रूप से lsछिपी हुई फ़ाइलों और निर्देशिकाओं को छोड़कर फ़ाइल नामों को प्रिंट करेगा।

यदि आपके पास ग्लोबिंग सक्षम नहीं है, तो इसे करें shopt -s globstar

नोट: बैश 4, zsh और इसी तरह के गोले में एक नया ग्लोबिंग विकल्प काम करता है।


उदाहरण:

$ mkdir -vp a/b/c/d
mkdir: created directory 'a'
mkdir: created directory 'a/b'
mkdir: created directory 'a/b/c'
mkdir: created directory 'a/b/c/d'
$ touch a/b/c/d/foo a/b/c/d/bar  a/b/c/d/.foo_hidden a/b/c/d/foo_not_hidden
$ echo **/*foo*
a/b/c/d/foo  a/b/c/d/foo_not_hidden

5
आप lsउस के लिए की जरूरत नहीं है! echo **/*foo*
केविन कॉक्स

@kenorb (और @ केविन-कॉक्स)। क्या आप कुछ और क्रिया कर सकते हैं? ग्लोबस्टार (= *) यहाँ क्यों और कैसे काम करता है? स्लैश / क्या करता है?
नट्टी के बारे में अखरोट

@nuttyaboutnatty का /अर्थ है फ़ोल्डर, यह फ़ाइल नाम से निर्देशिकाओं को अलग करता है। *मूल रूप से सब कुछ का प्रतिनिधित्व करता है।
केनोरब

@kenorb हां-लेकिन: मूल प्रश्न के साथ वह एक-लाइनर कैसे मदद करता है?
नट्टी के बारे में

1
@nuttyaboutnatty स्पष्ट और जोड़ा गया उदाहरण। यह छिपे हुए को अनदेखा करने वाली फ़ाइलों को खोजने में मदद करता है।
कीनॉर्ब

1

@ फ्लिम का जवाब अच्छा है, खासकर क्योंकि यह छिपे निर्देशिकाओं में उतरने से रोकता है । मुझे यह सरलीकरण पसंद है:

आम तौर पर सभी छिपे हुए रास्तों को बाहर करने के लिए (नियमित फाइलें, निर्देशिका, आदि):

find <start-point> -path '*/.*' -prune -o <expression> -print

उदाहरण के लिए, स्टार्टिंग पॉइंट और -name '*some text*'एक्सप्रेशन के रूप में अपनी वर्किंग डायरेक्टरी का उपयोग करना :

find . -path '*/.*' -prune -o -name '*some text*' -print

@ फ़्लिम का जवाब क्या है इसके विपरीत, कोई छिपी हुई फ़ाइलें या छिपी निर्देशिका सरल मामला नहीं है। -path '*/.*'अभिव्यक्ति किसी भी पथ (नियमित फाइल, निर्देशिका, आदि) है कि एक के लिए सच है ., तुरंत अपनी फ़ाइल विभाजक के बाद /। तो यह लाइन छिपी हुई फ़ाइलों और निर्देशिकाओं दोनों को चुभेगी।

छिपी निर्देशिकाओं को बाहर करते हुए छिपी हुई फ़ाइलों को अनुमति देना वह मामला है जिसके लिए एक और फ़िल्टर की आवश्यकता होती है। यह वह जगह है जहाँ आप -type dअभिव्यक्ति में छंटाई की जा रही है को शामिल करेंगे ।

find <start-point> -type d -path '*/.*' -prune -o <expression> -print 

उदाहरण के लिए:

find . -type d -path '*/.*' -prune -o -name '*some text*' -print

इस मामले -type d -path '*/.*'में trueकेवल निर्देशिकाओं के लिए है, और इसलिए केवल निर्देशिकाएँ छंट जाती हैं।


0

findइस तरह के स्वच्छ तर्क स्विच है -andऔर -notआप उन्हें अपने लाभ के लिए उपयोग कर सकते हैं जैसे दो नियमों के साथ एक मेल खाने वाली फ़ाइल:

$ touch non_hidden_file.txt .hidden_file.txt somethings/.another_hidden_file.txt                                                 

$ find . -type f -name '*hidden_file*' -and \( -not -name ".*" \)                            
./non_hidden_file.txt

जैसा कि आप देख सकते हैं, findदो नियमों का उपयोग करता है -name '*hidden_file*'और -and \( -not -name ".*" \)उन फ़ाइलनामों को खोजने के लिए जो दोनों स्थितियों से मेल खाते हैं - hidden_fileइसके साथ फ़ाइल नाम लेकिन प्रमुख डॉट के बिना। कोष्ठक के सामने स्लैश पर ध्यान दें - इनका उपयोग कोष्ठक को परिभाषित करने के लिए कोष्ठक के रूप में परिभाषित करने के लिए किया जाता है find(जो कि कोष्ठक का अर्थ है अन्यथा स्लैश के बिना)


0
$ pwd
/home/victoria

$ find $(pwd) -maxdepth 1 -type f -not -path '*/\.*' | sort
/home/victoria/new
/home/victoria/new1
/home/victoria/new2
/home/victoria/new3
/home/victoria/new3.md
/home/victoria/new.md
/home/victoria/package.json
/home/victoria/Untitled Document 1
/home/victoria/Untitled Document 2

$ find . -maxdepth 1 -type f -not -path '*/\.*' | sed 's/^\.\///g' | sort
new
new1
new2
new3
new3.md
new.md
package.json
Untitled Document 1
Untitled Document 2

टिप्पणियाँ:

  • . : मौजूदा फोल्डर
  • -maxdepth 1पुनरावर्ती खोजने के लिए निकालें
  • -type f: फ़ाइलें खोजें, निर्देशिका नहीं ( d)
  • -not -path '*/\.*' : नहीं लौटा .hidden_files
  • sed 's/^\.\///g': ./परिणाम सूची में से निकाला गया हटा दें
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.