फ़ाइल की सामग्री के बजाय फ़ाइल नाम के लिए "grep" कैसे करें?


135

grep का उपयोग किसी फ़ाइल में यह देखने के लिए किया जाता है कि क्या कोई रेखा किसी दिए गए नियमित अभिव्यक्ति से मेल खाती है। हालांकि, मेरे पास यह स्थिति है - मैं एक नियमित अभिव्यक्ति लिखना चाहता हूं जो फ़ाइल नाम से मेल खाएगी (और फ़ाइल की सामग्री नहीं)। मैं इसे सिस्टम के रूट डायरेक्टरी से चलाऊंगा, उन सभी फाइलों को खोजने के लिए जो नियमित अभिव्यक्ति से मेल खाती हैं।

उदाहरण के लिए, यदि मैं सभी VB फॉर्म फाइलें ढूंढना चाहता हूं, जो "f" से शुरू होती हैं और .fr के साथ समाप्त होती हैं, तो मैं नियमित रूप से उपयोग करूंगा -

   "f[[:alnum:]]*\.frm"

क्या grep ऐसा कर सकता है? यदि नहीं, तो क्या कोई उपयोगिता है जो मुझे ऐसा करने देगी? धन्यवाद।

जवाबों:


120

आपको इस मामले में findइसके बजाय उपयोग करने की आवश्यकता है grep

तुम भी उपयोग कर सकते हैं findके साथ संयोजन में grepया egrep:

$ find | grep "f[[:alnum:]]\.frm"

12
यह अनावश्यक है। ढूँढें में -regexविकल्प के साथ अंतर्निहित कार्यक्षमता है ।
व्हेरेसडेन

4
यह यहाँ अनावश्यक है, लेकिन grep perl regex का समर्थन करता है जबकि खोज नहीं करता है।
दान

2
नहीं, आप grep का उपयोग कर सकते हैं। रास्ता खोजने की तुलना में आसान है। स्विच "-rl" जोड़ें और यह फ़ाइल के बजाय फ़ाइल नाम खोजेगा। मेरी पोस्ट नीचे देखें।
RM

@ Alpha_989, मैंने कहा कि grep इसका समर्थन करता है, जो यह करता है: gnu.org/software/grep/manual/html_node/… इस बिंदु को grep को पाइप करना केवल तभी आवश्यक है जब आपको pcre की आवश्यकता हो। whereswalden का सही जवाब है
Dan

60

उदाहरण

find <path> -name *FileName*

मैनुअल से:

-नाम पैटर्न

फ़ाइल नाम का आधार (हटाए गए प्रमुख निर्देशिकाओं के साथ पथ) शेल पैटर्न पैटर्न से मेल खाता है। क्योंकि प्रमुख निर्देशिकाओं को हटा दिया जाता है, इसलिए -name के साथ मैच के लिए माने जाने वाले फ़ाइल नामों में कभी कोई स्लैश शामिल नहीं होगा, इसलिए "-name a / b" कभी भी किसी भी चीज़ से मेल नहीं खाएगा (आपको संभवतः इसके बजाय -पैथ का उपयोग करने की आवश्यकता है)। मेटाचैकर्स ("*", "?", और "[]") "a" से मेल खाते हैं। आधार नाम की शुरुआत में (यह Findils utils-4.2.2 में एक परिवर्तन है; नीचे दिए गए अनुभाग देखें)। किसी निर्देशिका और इसके अंतर्गत आने वाली फ़ाइलों को अनदेखा करने के लिए, -prune का उपयोग करें; -पथ के वर्णन में एक उदाहरण देखें। ब्रेस को विशेष होने के रूप में मान्यता प्राप्त नहीं है, इस तथ्य के बावजूद कि बैश सहित कुछ गोले शेल पैटर्न में एक विशेष अर्थ के साथ ब्रेस करते हैं। फ़ाइलनाम मिलान fnmatch (3) लाइब्रेरी फ़ंक्शन के उपयोग के साथ किया जाता है। खोल द्वारा विस्तार से बचाने के लिए उद्धरण में पैटर्न को संलग्न करना न भूलें।


2
मुझे यह उत्तर सबसे उपयोगी लगा। मैंने कुछ अतिरिक्त विकल्प जोड़े: find . -maxdepth 1 -name "*filename*" -print
JSON C11

47

जैसा कि पाब्लो ने कहा, आपको findइसके बजाय उपयोग करने की आवश्यकता है grep, लेकिन पाइप findको पाइप करने की कोई आवश्यकता नहीं है grepfindउस कार्यक्षमता में बनाया गया है:

find . -regex 'f[[:alnum:]]\.frm'

findनाम से फ़ाइलों की खोज करने और फ़ाइल प्रकार, गहराई सीमित करने, बूलियन संचालन के साथ अलग-अलग खोज शब्दों को संयोजित करने और मिली फ़ाइलों पर मनमाना आदेशों को निष्पादित करने के लिए एक बहुत शक्तिशाली कार्यक्रम है। देखें खोजने आदमी पेज अधिक जानकारी के लिए।


1
मुझे लगता है की बहुत आसान सुविधा के साथ तारीख तक खोज बढ़ेगी -mtimeऔर-mmin
Johnride

1
इसके अलावा, -regex स्विच पूरे पथ के साथ मेल खाता है। उदाहरण के लिए काम करने के लिए regex शुरुआत में जोड़ना होगा।
तुम्सागुइ

15

आप grep का उपयोग करके फ़ाइल का पूरा पथ पा सकते हैं, बस पेड़ के आउटपुट को पाइप कर सकते हैं

tree -f | grep filename

यहाँ एक फ़ंक्शन है जिसे आप अपने .bash_profile या .bashrc में डाल सकते हैं

findfile(){ tree -f | grep $1; } # $1 = filename, -f is full path

-f वैकल्पिक है।
jasonleonhard

10
find -iname "file_name"

Syntax :-
find -type type_descriptor file_name_here

type_descriptor प्रकार: -

एफ: नियमित फ़ाइल

डी: निर्देशिका

एल: प्रतीकात्मक लिंक

c: चरित्र उपकरण

बी: ब्लॉक डिवाइस


1
मैं -type typedescriptorअकेले एक फ़ाइल नाम का उपयोग नहीं कर सकता । क्या यह गलती है?
एलन नोरगार्ड

5

आप भी कर सकते हैं:

tree | grep filename

यह खोज के लिए grep करने के लिए ट्री कमांड के आउटपुट को पाइप करता है। यह केवल आपको बताएगा कि फ़ाइल मौजूद है या नहीं।


1

नहीं, grep इसके लिए ठीक काम करता है:

 grep -rl "filename" [starting point]

 grep -rL "not in filename"

1
यह "फ़ाइल नाम" के लिए फ़ाइल सामग्री खोजता है, फिर मैचों के साथ फ़ाइलों के नाम प्रिंट करता है। OP फ़ाइल नामों से मेल खाना चाहता है, फ़ाइल सामग्री नहीं।
मैथ्यू

1
सहमत, यह फ़ाइल नाम नहीं खोजता है, यह सिर्फ उन फ़ाइलनाम के नाम प्रिंट करता है जिसके लिए यह सामग्री मिलान पाया जाता है । आपने दोनों विकल्पों -lऔर -Lविकल्पों को काफी गलत समझा है ।
प्रोमेथियस

2
+1 मुझे वही चाहिए जो मुझे चाहिए। हैप्पी मुझे इस सवाल की आलोचना करने की ज़रूरत नहीं थी कि मुझे जो जवाब चाहिए, वह था
अलेक्जेंडर मैकएनकैल्टी

-1

कई फ़ाइलों के लिए भी।

tree /path/to/directory/ | grep -i "file1 \| file2 \| file3"

-1

सबसे आसान तरीका है

find . | grep test

यहाँ पाएं (।) यानी वर्तमान निर्देशिका की सभी फाइलों को पुनरावर्ती रूप से सूचीबद्ध करेंगे। और फिर यह सिर्फ एक साधारण grep है। "परीक्षण" नाम की सभी फाइलें दिखाई देंगी।

आप अपनी आवश्यकता के अनुसार grep के साथ खेल सकते हैं। नोट: चूंकि grep जेनेरिक स्ट्रिंग वर्गीकरण है, इसलिए यह आपको न केवल फ़ाइल नाम देने में परिणाम कर सकता है। लेकिन यदि किसी पथ की निर्देशिका है ('/xy_test_123/other.txt') भी परिणाम सेट पर आ जाएगा। चियर्स


यह पथ में "परीक्षण" के साथ कुछ भी पाएगा, उदाहरण के लिए ./foo/bar/latest/fred.txt
पॉल आर

ओह। कि मैं एक के बारे में नहीं सोचा था। उल्लेख करने के लिए धन्यवाद।
साची
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.