मैं वाइल्डकार्ड मिलान के आधार पर वर्तमान और सबफ़ोल्डर्स में सभी फ़ाइलों को कैसे पुन: खोज सकता हूं?


1886

मैं वाइल्डकार्ड मिलान के आधार पर वर्तमान और सबफ़ोल्डर्स में सभी फ़ाइलों को कैसे पुन: खोज सकता हूं?

जवाबों:


2738

इसके लिए खोज का उपयोग करें :

find . -name "foo*"

findएक प्रारंभिक बिंदु की जरूरत है, और .(डॉट) वर्तमान निर्देशिका को इंगित करता है।


21
मुझे पता है कि इसे linux के रूप में टैग किया गया है लेकिन यह ध्यान देने योग्य है: पथ को अन्य * nix वेरिएंट के लिए आवश्यक है जो linux नहीं हैं। यदि आप डॉट का उपयोग करना चाहते हैं, तो लिनक्स पर, पथ वैकल्पिक है।
आईलैंडको

4
@ सीटर "फू *" बताता है कि "फू" से शुरू होने वाली सभी फाइलों की तलाश करें। यह सिर्फ उसका उदाहरण है। आप सभी फ़ाइलों को खोजने के लिए "gpio *" का उपयोग कर सकते हैं, जिनका नाम gpio से शुरू होता है, या gpio1 नाम की सभी फ़ाइलों को खोजने के लिए "gpio1"।
schumacher574

29
ध्यान दें कि "फू *" उद्धरणों में है इसलिए शेल इसे खोजने के लिए पास करने से पहले इसका विस्तार नहीं करता है। यदि आपने अभी-अभी किया है find . foo*, foo*तो इसका विस्तार किया जाएगा और खोजने के लिए इसे पारित किया जाएगा।
मुस्कराहट

32
वर्सेटिव स्ट्रेसिंग जो " "पुनरावर्ती खोज के लिए बहुत आवश्यक है।
वेस्टर्नगंज

3
इसके अलावा उपयोगी: यदि आप उन निर्देशिकाओं के बारे में सूचित नहीं करना चाहते हैं जिनके लिए आपको (या अन्य त्रुटियों) की अनुमति नहीं है, तो आप कर सकते हैंfind . -name "foo*" 2>/dev/null
Jobbo

221

पाइपिंग को grep में ढूंढना अक्सर अधिक सुविधाजनक होता है; यह आपको मनमाने वाइल्डकार्ड मिलान के लिए नियमित अभिव्यक्ति की पूरी शक्ति देता है।

उदाहरण के लिए, फ़ाइल नाम में असंवेदनशील स्ट्रिंग "फू" के साथ सभी फ़ाइलों को खोजने के लिए:

~$ find . -print | grep -i foo

56
findभी है -iname, -regexऔर -iregexइसलिए करने के लिए पाइप, केस-संवेदी वाइल्डकार्ड, regex, और केस-संवेदी रेगुलर एक्सप्रेशन मिलान के लिए झंडे grepअनावश्यक है।
इबेंडर

7
मुझे नहीं लगता कि यह अनावश्यक होने के बारे में है, लेकिन अधिक सुविधाजनक होने के नाते।
एलिय्याह लिन

1
हालाँकि, grep -v पर पाइपिंग आपको सरल स्ट्रिंग्स या regexes का उपयोग करने की अनुमति दे सकता है जो आप नहीं चाहते हैं।
दरवाजा_नंबर_थ्री

3
@ आईओबेंडर - अफसोस की बात है, मैं आपको अनुभव से बता सकता हूं कि सभी सिस्टम एक findकमांड के साथ नहीं आते हैं जो उन विकल्पों का समर्थन करता है। कभी-कभी grepएकमात्र विकल्प बन जाता है।
श्री लामा

150

find एक पैटर्न से मेल खाने वाली सभी फाइलें मिलेंगी:

find . -name "*foo"

हालांकि, अगर आप एक तस्वीर चाहते हैं:

tree -P "*foo"

उम्मीद है की यह मदद करेगा!


18
brew install treeMac OSX उपयोगकर्ताओं के लिए w / o apt-getस्थापित
DeBraid

1
MacOS सिएरा पर परीक्षण किया गया, बस '--प्रिंट' -> 'जोड़ें। नाम "* फू" - छाप '। superuser.com/questions/177289/searching-mac-through-terminal
जॉन-सलिब

2
Cento के लिए sudo yum install -y
संतोष कुमार अर्जुनन

39
find -L . -name "foo*"

कुछ मामलों में, मुझे प्रतीकात्मक निर्देशिका लिंक को संभालने के लिए -L पैरामीटर की आवश्यकता है। डिफ़ॉल्ट रूप से प्रतीकात्मक लिंक को अनदेखा किया जाता है। उन मामलों में यह काफी भ्रामक था क्योंकि मैं निर्देशिका को एक उप-निर्देशिका में बदल दूंगा और फ़ाइल को पैटर्न से मेल खाता हुआ देखूंगा, लेकिन फ़ाइल नाम वापस नहीं करूंगा। उपयोग -L उस समस्या को हल करता है। खोजने के लिए प्रतीकात्मक लिंक विकल्प हैं -L -H


1
एल स्विच बहुत मददगार है। कई बार उपयोगकर्ता को अंतर्निहित निर्देशिकाओं के बारे में कोई जानकारी नहीं होती है, चाहे वे सॉफ्टलिंक हों या सामान्य निर्देशिकाएं हों। इसलिए संदेह की स्थिति में, एल विकल्प का उपयोग करना हमेशा अच्छा होता है। कम से कम, इसने हमेशा मेरी मदद की है।
रितेश

2
मेरे लिए यही जवाब था। धन्यवाद!
iedmrc

33

यदि आपका शेल एक नया ग्लोबबिंग विकल्प का समर्थन करता है (द्वारा सक्षम किया जा सकता है shopt -s globstar) : आप उपयोग कर सकते हैं:

echo **/*foo*

किसी भी फाइल या फोल्डर को पुनरावर्ती खोजने के लिए। यह बैश 4, zsh और इसी तरह के गोले द्वारा समर्थित है।


व्यक्तिगत रूप से मुझे यह शेल फ़ंक्शन परिभाषित मिला है:

f() { find . -name "*$1*"; }

नोट: ऊपर की रेखा को सीधे शेल में चिपकाया जा सकता है या आपके उपयोगकर्ता में जोड़ा जा सकता है ~/.bashrc फ़ाइल ।

फिर मैं टाइप करके किसी भी फाइल को देख सकता हूं:

f some_name

वैकल्पिक रूप से आप एक साधारण वाक्यविन्यास के साथ एक fdउपयोगिता का उपयोग कर सकते हैं , जैसे fd pattern


1
यह सिर्फ एक ही स्तर पर चला जाता है। मेरे लिए उप निर्देशिकाओं में पीछे नहीं
हटना

3
@Broncha क्योंकि आपको shopt -s globstarकमांड द्वारा विस्तारित ग्लोबिंग को सक्रिय करने की आवश्यकता है । यह बैश, zsh और इसी तरह के गोले में समर्थित है।
केनोरब

bash-3.2$ shopt -s globstarदेता हैbash: shopt: globstar: invalid shell option name
drewish

@ ड्रूइस आपको अपने बैश को 4.x
केनोरब

गूंज * / * फू से कम तेज है
जोसेफ क्लिमुक

31

fd

मामले में, findबहुत धीमी है, fdउपयोगिता का प्रयास करें - एक सरल और तेज विकल्पfind रस्ट में लिखा गया ।

वाक्य - विन्यास:

fd PATTERN

डेमो:

मुखपृष्ठ: https://github.com/sharkdp/fd


17
पहली बार मैंने एसओ पर लगभग 9 वर्षों में एक जीआईएफ देखा है। अच्छी नौकरी!
यहोशू पिंटर

1
वे प्रदर्शन परिणाम बहुत आशाजनक दिखते हैं। आप घर-काढ़ा में fd जोड़ने पर विचार कर सकते हैं ...
Gr3go

विषय: आप डेमो के लिए svg फ़ाइल बनाने के लिए किस टूल का उपयोग करते हैं?
aprodan

2
@aprodan डेमो छवि को GitHub से कॉपी किया गया था, लेकिन मेरा मानना ​​है कि वे उपयोग कर रहे हैं asciinema, फिर GIF प्रारूप में परिवर्तित हो गया, लेकिन मुझे यकीन नहीं है।
kenorb

1
वास्तव में यह एसवीजी प्रारूप है, इसलिए संभवतः asciicast2vectorइसका उपयोग किया जा सकता है।
kenorb

27
find <directory_path>  -type f -name "<wildcard-match>"

वाइल्डकार्ड-मैच में आप वह स्ट्रिंग प्रदान कर सकते हैं जिसे आप मैच करना चाहते हैं जैसे * .सी। (सभी सी फाइलों के लिए)


1
आपका उत्तर यहां सबसे पहला सही है क्योंकि यह केवल निर्दिष्ट फाइलों को खोजता है। अन्य प्रकार निर्दिष्ट नहीं करने पर निर्देशिका वापस आ जाएगी।
विल्सोटेक

यदि आप एक निर्देशिका "-type f" की खोज करना चाहते हैं, तो "
-type

11

आप उपयोग कर सकते हैं:

# find . -type f  -name 'text_for_search'

यदि आप REGX का उपयोग करना चाहते हैं -iname

# find . -type f  -iname 'text_for_search'

9

निम्न आदेश वर्तमान और इसके उप फ़ोल्डरों में सटीक नाम "पैटर्न" (उदाहरण के लिए) वाली सभी फाइलों को सूचीबद्ध करेगा।

find ./ -name "pattern"


8

पुनरावर्ती फ़ाइल की खोज करने का डिफ़ॉल्ट तरीका, और अधिकांश मामलों में उपलब्ध है

find . -name "filepattern"

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

man find

या यदि आपके सिस्टम में मैन पेज उपलब्ध नहीं हैं

find --help

हालाँकि, अधिक आधुनिक और तेज़ उपकरण हैं, फिर पाते हैं, जो आपके पूरे फाइलसिस्टम को ट्रेस कर रहे हैं और आपकी फ़ाइलों को अनुक्रमणित कर रहे हैं, ऐसा ही एक सामान्य टूल है। इसे स्थापित करने के लिए डेटाबेस शुरू करने की जरूरत है, अगर स्क्रिप्ट आपके लिए इसे स्थापित नहीं करती है, तो इसे मैन्युअल रूप से टाइप करके किया जा सकता है

sudo updatedb

और, कुछ विशेष प्रकार की फ़ाइल देखने के लिए इसका उपयोग करने के लिए

locate filename

या, वर्तमान निर्देशिका के भीतर फ़ाइल नाम या पॉटर देखने के लिए, आप टाइप कर सकते हैं:

 pwd | xargs -n 1 -I {} locate "filepattern"

यह फ़ाइलों के अपने डेटाबेस के माध्यम से दिखेगा और आपके द्वारा टाइप किए गए पैटर्न से मेल खाने वाले पथ नामों को जल्दी से प्रिंट करेगा। पता लगाने के विकल्पों की पूरी सूची देखने के लिए, टाइप करें: locate --help याman locate

इसके अतिरिक्त, आप क्रोन जॉब के माध्यम से निर्धारित समय पर डेटाबेस को अपडेट करने के लिए इसे कॉन्फ़िगर कर सकते हैं, इसलिए नमूना क्रॉन जो 1AM पर db को अपडेट करता है, वह निम्न होगा:

0 1 * * * updatedb

इन क्रोन नौकरियों को रूट द्वारा कॉन्फ़िगर करने की आवश्यकता है, क्योंकि अपडेटेड को पूरे फाइलसिस्टम को पार करने के लिए रूट विशेषाधिकार की आवश्यकता होती है।


7

फ़ाइल खोज के लिए
find / -xdev -name settings.xml -> संपूर्ण कंप्यूटर
find ./ -xdev -name settings.xml -> वर्तमान निर्देशिका और

एक्सटेंशन प्रकार वाली फ़ाइलों के लिए इसकी उप निर्देशिका

find . -type f -name "*.iso"

6

मुझे यह देखकर आश्चर्य हुआ कि जब हम पुनरावर्ती रूप से जाने वाले होते हैं, तो इसका पता लगाना बहुत अधिक उपयोग नहीं किया जाता है।

मैं सबसे पहले ब्याज की वर्तमान फ़ोल्डर में फ़ाइलों की सूची प्राप्त करने के लिए "$ PWD" का पता लगाऊंगा, और फिर उन पर greps चलाऊंगा जैसा कि कृपया।

locate "$PWD" | grep -P <pattern>

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


locate "$PWD*.mp4" बस याद दिलाने के लिए आप को छोड़ करने में सक्षम हो सकता है किgrep
Jefferey गुफा

5

नीचे आदेश किसी भी फाइल को खोजने में मदद करता है

1) मामले
2 की परवाह किए बिना) परिणाम
3 की अनुमति के बिना फ़ोल्डरों को बाहर करना ) 3 जड़ या आप की तरह से खोज करना। अपने द्वारा पसंद किए जाने वाले पथ को बदलें / बदलें।

सिंटेक्स:
खोज -iname '' 2> & 1 | grep -v "अनुमति से इनकार किया"

उदाहरण

find / -iname 'C * .xml' 2> & 1 | grep -v "अनुमति अस्वीकृत"

find / -iname '*C*.xml'   2>&1 | grep -v "Permission denied"

1
पृथ्वी पर आप उसके लिए grep का उपयोग क्यों करते हैं? अशक्त करने के लिए बस पुनर्निर्देशित stderrfind / -iname '*C*.xml' 2>/dev/null
19 '

3

यदि आप वाइल्डकार्ड के साथ विशेष फ़ाइल खोजना चाहते हैं, तो आप निम्न कोड का उपयोग कर सकते हैं:

find . -type f -name "*.conf"

मान लीजिए, आप यहां से प्रत्येक .conf फ़ाइलों को खोजना चाहते हैं:

.इसका मतलब है कि यहां से शुरू हुई खोज (वर्तमान स्थान) का
-typeमतलब है कि यहां खोज का प्रकार फ़ाइल (एफ) है।
-nameइसका मतलब है कि आप * .conf नामों वाली फ़ाइलों को खोजना चाहते हैं ।


3

यह वर्तमान और उप निर्देशिकाओं में सभी संबंधित फाइलों की खोज करेगा, उनकी लाइन की गणना के साथ-साथ पूरी तरह से गणना करेगा:

find . -name "*.wanted" | xargs wc -l

2

उपयोग

find path/to/dir -name "*.ext1" -o -name "*.ext2"

व्याख्या

  1. पहला पैरामीटर वह निर्देशिका है जिसे आप खोजना चाहते हैं।
  2. डिफ़ॉल्ट रूप से find से पुनरावर्तन करता है।
  3. -oके लिए खड़ा है -or। तो ऊपर इस वाइल्डकार्ड या यह एक के लिए खोज का मतलब है। यदि आपके पास केवल एक पैटर्न है तो इसकी कोई आवश्यकता नहीं है-o
  4. वाइल्डकार्ड पैटर्न के आसपास के उद्धरण आवश्यक हैं।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.