उनके नाम के केवल भाग को खोजकर फाइलें खोजने की आज्ञा दें?


32

कहते हैं कि नाम के साथ फाइलें हैं:

batman.c
debate.c
cricketbat.c

Searchtag का उपयोग करके इन सभी फ़ाइलों को सूचीबद्ध करने के लिए मुझे क्या कमांड और इसका उपयोग कैसे करना चाहिए bat?


5
क्या आप केवल वर्तमान निर्देशिका में मिलान वाली फ़ाइलों को सूचीबद्ध करना चाहते हैं? किसी भी निर्देशिका में या वर्तमान निर्देशिका के नीचे? सिस्टम पर कहीं भी?
स्टीलड्राइवर

जवाबों:


47

batकहीं भी फाइल्स ढूंढना

/path/to/folderजिनके नाम में कहीं भी सभी फाइलों को खोजने के लिए bat, आप उपयोग कर सकते हैं:

find /path/to/folder -name '*bat*'

मेरे पास है उद्धृत खोज पैटर्न *bat*, क्योंकि अगर उद्धरण को छोड़ दिया गया और फ़ाइलों से मेल *bat*मौजूदा निर्देशिका में, खोल विस्तार होगा *bat*उनमें से एक सूची में और पारित है कि करने के लिए find। तब findसही काम नहीं करेगा। ( \*bat\*और "*bat*"भी काम करते हैं।)

उस फ़ोल्डर में खोज करने के लिए, जो आप वर्तमान में हैं (उदाहरण के लिए, आपके द्वारा cdसंपादित किया गया है), उपयोग करें ., हमेशा की तरह:

find . -name '*bat*'

अपने पूरे कंप्यूटर को खोजने के लिए, का उपयोग करें/ । अपने घर निर्देशिका, उपयोग ~, या अपने घर निर्देशिका का पूरा नाम खोजने के लिए । ( शेल~ आपके होम डाइरेक्टरी के पूरी तरह से योग्य पथ पर विस्तृत है।)

नाम के आधार पर आपकी खोज को व्यापक या संकीर्ण करना

आप, केस-insensitively खोज ताकि फ़ाइलों से युक्त करना चाहते हैं BAT, bAtऔर इसके आगे मिलान किया जाता है, का उपयोग -inameकरने के बजाय परीक्षण -nameपरीक्षण:

find /path/to/folder -iname '*bat*'

मैंने देखा है कि आपकी सभी फाइलें समाप्त हो गई हैं .c। यदि आप केवल उस तरह की फ़ाइलें ढूंढना चाहते हैं, तो उपयोग करें:

find /path/to/folder -name '*bat*.c'

मैंने देखा कि आपके सभी फ़ाइलनाम हैं bat या तो बहुत शुरुआत में है या .cप्रत्यय से पहले का हिस्सा है । यदि आप मेल खाने वाली फ़ाइलों से बचना चाहते हैं embattled.c, तो आप इसका उपयोग कर सकते हैं:

find /path/to/folder -name '*bat.c' -o -name 'bat*.c'

-oहै या ऑपरेटर।

मिलान केवल फ़ाइलें

केवल नियमित फ़ाइलों को खोजने के लिए - और फ़ोल्डर नहीं, प्रतीकात्मक लिंक, और विशेष उपकरण नोड्स - आप उपयोग कर सकते हैं -type f। यह अक्सर अनुशंसित होता है और कभी-कभी काफी उपयुक्त होता है ... लेकिन अक्सर वह नहीं जो आप वास्तव में चाहते हैं , खासकर यदि आप दौड़ रहे हैंfind स्वयं आउटपुट की जांच करने के उद्देश्य से । यदि आपके पास एक प्रतीकात्मक लिंक है जो आपकी खोज से मेल खाता है, तो क्या आप इसके बारे में जानना नहीं चाहेंगे?

यदि आप नियमित फाइल और प्रतीकात्मक लिंक दोनों को खोजना चाहते हैं, तो आप इसका उपयोग कर सकते हैं:

find /path/to/folder -name '*bat*' \( -type f -o -type l \)

का उपयोग करता है -o ऑपरेटर और समूहीकरण के लिए कोष्ठक का भी (जिसे उद्धृत किया जाना चाहिए ताकि शेल उन्हें विशेष रूप से व्यवहार न करें, अन्यथा आपको एक सिंटैक्स त्रुटि मिलेगी)।

लेकिन मान लीजिए कि आप केवल प्रतीकात्मक लिंक देखना चाहते हैं जो अंततः एक नियमित फ़ाइल को इंगित करता है (और निर्देशिका, डिवाइस नोड्स आदि के लिए प्रतीकात्मक लिंक नहीं)। यह वास्तव में और भी सरल है: -xtypeइसके बजाय का उपयोग करें -type। बशर्ते आप ध्वज के findसाथ नहीं चल रहे हों -L, -xtypeएक प्रतीकात्मक लिंक पर उस फ़ाइल के प्रकार का परीक्षण करता है जिससे लिंक इंगित करता है।

find /path/to/folder -name '*bat*' -xtype f

यदि आपके पास किसी फ़ाइल के लिए किसी अन्य सिमलिंक के लिए एक सिमलिंक है, -xtype fतो इसके प्रत्यक्ष होने पर भी इसका मिलान होगा लक्ष्य एक रेगुलर फ़ाइल के बजाय एक अन्य सिम्लिंक है। यह लगभग हमेशा वही होता है जो आप चाहते हैं।

अक्सर लोग सोचते हैं कि वे चाहते हैं -type f , लेकिन वास्तव में वे चाहते हैं -xtype f

विस्तृत आउटपुट प्राप्त करना

findयदि आप निर्दिष्ट नहीं करते हैं तो डिफ़ॉल्ट क्रिया है -print। ऊपर दी गई सभी कमांड्स अपने आप के साथ बराबर हैं-print अंत में निपटने के ।

findअक्सर पाया जाने वाली फ़ाइलों के आधार पर कमांड चलाने के लिए उपयोग किया जाता है - अक्सर, कमांड जो बदलाव करते हैं। लेकिन ऐसी अन्य क्रियाएं भी हैं जिनका उद्देश्य इसके अलावा परिणाम प्रदर्शित करना है -print। विशेष रुचि है -ls:

find /path/to/folder -name '*bat*' -ls

यह प्रत्येक फाइल पर विस्तृत जानकारी देता है, एक बहु-स्तंभ प्रारूप में, (जैसा कि बिल्कुल वैसा ही नहीं), जो आप चलाकर देखेंगे ।ls file

आगे की पढाई

findफ़ाइलों को खोजने के अन्य तरीकों और जानकारी के लिए, देखें:


1
महान जवाब, विशेष रूप से -xtypeसलाह; शायद ls *bat*और -maxdepth/ mindepthभी ध्यान देने योग्य हैं।
mklement0

2
@ mklement0 धन्यवाद! ओपी ने अभी तक यह स्पष्ट नहीं किया है कि फाइलें कहां हैं और पुनरावृत्ति की आवश्यकता है या नहीं। जैसा कि अराजकता का जवाबls पहले से ही शामिल है , मैंने findयहाँ के साथ पुनरावर्ती मामले पर ध्यान केंद्रित किया । बेशक, कुछ पैटर्न ( lsऔर findसाथ -maxdepth) से मेल खाने वाले फ़ाइलनामों की गैर (या कम) -सीरेक्टिव लिस्टिंग को कवर करने वाला एक विस्तृत उत्तर भी उपयोगी होगा। आप इस तरह के उत्तर को पोस्ट करना चाह सकते हैं!
एलिया कगन

16

सबसे आसान तरीका है दौड़ना

locate bat

इस तरह आप फ़ाइल नाम में "बैट" वाली फ़ाइलों के लिए पूरे कंप्यूटर के माध्यम से खोज सकते हैं

अपने पीसी पर फ़ाइलों की सूची को ताज़ा करने के लिए

updatedb

इस कमांड को तब चलाएं जब आपने हाल ही में अपने खाते में नई फाइलें जोड़ी हैं



4
@Serg नई फ़ाइलों को खोजने के लिए (पिछली बार की तुलना में नई बार updatedbमैन्युअल रूप से या स्वचालित रूप से चला गया था), sudo updatedbपहले चलाने की आवश्यकता होगी, हाँ।
एलिया कगन

ध्यान दें कि यह मिलान करने वाले नामों के लिए संपूर्ण सिस्टम को खोजेगा bat
टेर्डन

1
@terdon मैंने पहले ही उत्तर में यह कहा था, मुझे नहीं लगता कि जब मैंने पहले ही यह कहा था कि यह नीचे के वोट का हकदार था।
मार्क किर्बी

1
ध्यान दें कि यह एक डेटाबेस से खोजों की तुलना find /में तेज है locate, जबकि findपुनरावर्ती सूची /से मेल खाता है और फिर रेगेक्स से मेल खाता है।
टिमोथी गु

14

टर्मिनल खोलें और निर्देशिका को निर्देशिका में बदलें जहां से आप खोज शुरू करना चाहते हैं और फिर इस कमांड को चलाएं:

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

.वर्तमान निर्देशिका से खोज आदेश शुरू होता है। स्ट्रिंग से मेल खाता है और केस संवेदी है। ( केस असंवेदनशील है) केवल फाइलों की खोज।
-namebat-iname
-type f


हटाएं और हटाएं? ओके +1: पी;)
एबी

6

यदि फ़ाइलें वर्तमान निर्देशिका उपयोग में हैं:

$ ls *bat*
batgirl.c  batman.c  batwoman.c  cricketbat.c

या (उन्हें लाइन से लाइन करने के लिए):

$ ls -1 *bat*
batgirl.c
batman.c
batwoman.c
cricketbat.c

यदि आप उस फाइल के लिए सिस्टम को खोजना चाहते हैं, तो उपयोग करें:

$ find / -name "*bat*"
/path/to/cricketbat.c
/path/to/batgirl.c
/path/to/batwoman.c
/path/to/batman.c

1
यदि आपकी खोज रूट निर्देशिका से शुरू हो रही है, तो आप sudo जोड़ना चाहते हैं, क्योंकि यह कमांड कुछ फ़ोल्डरों के लिए 'अनुमति अस्वीकृत' की रिपोर्ट करेगी
Sergiy Kolodyazhnyy

4

आप केस असंवेदनशील फ़ाइल नाम मिलान के लिए विकल्प या केस संवेदी फ़ाइल नाम मिलान findके -inameविकल्प के साथ कमांड का उपयोग करना चाहते हैं -name। ये दोनों आपको वाइल्डकार्ड नामों का उपयोग करने देंगे। इसलिए, किसी भी फ़ाइल नाम को खोजने के लिए जिसमें "बैट" होगा, जिसका आप उपयोग करेंगे:

find / -iname '*bat*'

या

find / -name '*bat*'

*"किसी भी वर्ण (ओं)" का अर्थ है, इसलिए खोज batकिसी भी वर्ण के साथ खोज रही है , जिसमें कोई भी नहीं है, इससे पहले या बाद में। /रूट निर्देशिका से खोजें रिकर्सिवली, तो आप उपयोग कर सकते हैं .जो मौजूदा निर्देशिका, या तुम कहाँ से खोज करना चाहते हैं के लिए निरपेक्ष पथ से रिकर्सिवली खोज करेंगे। लिनक्स शेल स्क्रिप्ट में रेगेक्स का उपयोग करके फ़ाइलों की खोज कैसे करें, इस पर एक नज़र डालें


@EliahKagan धन्यवाद, मैंने अपने उत्तर में कुछ और जानकारी जोड़ी है।
एजेफेरिस

+1 संपादन के लिए धन्यवाद। IMO यह इस जवाब की एक ताकत है कि यह अंधाधुंध उपयोग की सिफारिश करने से बचता है -type f, जो केवल निर्देशिकाओं को छोड़कर अधिक से अधिक करता है और अक्सर ऐसा नहीं होता है जो उपयोगकर्ता वास्तव में चाहते हैं
एलिया कगन

2

अच्छे पुराने का उपयोग करें find

find <path_for_search> -type f -iname "*bat*" 

उदा .:

% find . -type f -iname "*bat*" 
./batgirl.c
./batwoman.c
./cricketbat.c
./batman.c

से man find:

-type c
          File is of type c:
          [..]
          d      directory
          [..]
          f      regular file
          [..]

-iname pattern 
          Like -name, but the match is case insensitive.
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.