स्ट्रिंग युक्त नाम वाली सभी फाइलें खोजें


177

मैं एक ऐसी कमांड की खोज कर रहा हूं जो मौजूदा निर्देशिका से फाइल लौटाएगी जिसमें फ़ाइल नाम में एक स्ट्रिंग है। मैंने देखा है locateऔर findकमांड्स है जो फाइलों को किसी चीज से शुरू कर सकता है first_word*या किसी चीज के साथ समाप्त हो सकता है *.jpg

मैं उन फ़ाइलों की सूची कैसे वापस कर सकता हूं जिनमें फ़ाइल नाम में स्ट्रिंग है?

उदाहरण के लिए, यदि 2012-06-04-touch-multiple-files-in-linux.markdownवर्तमान निर्देशिका में एक फ़ाइल थी।

मैं इस फ़ाइल और अन्य को स्ट्रिंग से कैसे वापस कर सकता हूं touch? जैसे कमांड का उपयोग करनाfind '/touch/'


सवाल भ्रामक है। क्या आप उन फ़ाइलों को ढूंढना चाहते हैं जिनमें एक स्ट्रिंग है, या ऐसी फाइलें जिनके नाम में स्ट्रिंग है? पहले प्रश्न के साथ उत्तर दिया गया है man grep, दूसरे के साथ man find। आप आदमी का उपयोग करने के बजाय Google क्यों करेंगे, मुझे नहीं पता।
बस

1
धन्यवाद! पहला वाक्य यह निर्दिष्ट नहीं करता था कि फ़ाइल सामग्री थी या फ़ाइल नाम। अपडेट किया गया।
Dru

जवाबों:


303

उपयोग करें find:

find . -maxdepth 1 -name "*string*" -print

यह वर्तमान निर्देशिका में सभी फाइलें ढूंढेगा (हटाएं maxdepth 1यदि आप इसे पुनरावर्ती चाहते हैं) जिसमें "स्ट्रिंग" है और इसे स्क्रीन पर प्रिंट करेगा।

यदि आप ':' वाली फाइल से बचना चाहते हैं, तो आप टाइप कर सकते हैं:

find . -maxdepth 1 -name "*string*" ! -name "*:*" -print

यदि आप उपयोग करना चाहते हैं grep(लेकिन मुझे लगता है कि यह आवश्यक नहीं है जहाँ तक आप फ़ाइल सामग्री की जाँच नहीं करना चाहते हैं) आप उपयोग कर सकते हैं:

ls | grep touch

लेकिन, मैं दोहराता हूं, findआपके कार्य के लिए एक बेहतर और साफ समाधान है।


साभार @Zagorax यह बिल्कुल यही करता है। काश कमान इतनी लंबी नहीं होती लेकिन ayee :)
Dru

2
@ यदि आप कॉलोन से बचना चाहते हैं तो केस को कवर करने के लिए संशोधित करें। findएक बहुत शक्तिशाली उपकरण है, यह किसी भी तरह 'लंबा' होना चाहिए। :)
जैगोरैक्स

धन्यवाद पहले किसी भी सामग्री को वापस किए बिना इसे पूरी तरह से किया।
Dru

3
@, यदि आप इसे 'छोटा' चाहते हैं, तो आप इससे बच सकते हैं -printक्योंकि यह डिफ़ॉल्ट व्यवहार है और .यह डिफ़ॉल्ट फ़ोल्डर है जहाँ यह जाँच करता है।
ज़ागोरैक्स

1
find . -name "*string*"महान भी काम करता है। .मेरे अंत पर एक त्रुटि निकाल रहा है। धन्यवाद फिर से @Zagorax।
Dru

14

Grep का प्रयोग इस प्रकार करें:

grep -R "touch" .

-Rका अर्थ है पुनरावृत्ति। यदि आप इसके बजाय उपनिर्देशिका में नहीं जाएंगे, तो इसे छोड़ दें।

-iका अर्थ है "अनदेखा मामला"। आप इसे एक कोशिश के लायक भी पा सकते हैं।


महान। मैंने देखा कि कुछ फ़ाइल सामग्री एक का अनुसरण करती है :। वहाँ वैसे भी रोक है? शायद एक विकल्प का उपयोग करना?
Dru

1
कोशिश करें:grep -R "touch" . | cut -d ":" -f 2
सहलाते हुए

ऐसा लगता है कि केवल फ़ाइलों की सामग्री का उत्पादन करने के लिए। आपने अनिवार्य रूप से मेरे प्रश्न का उत्तर दिया, हालांकि, मैं सामग्री को वापस लेने के लिए कुछ खुदाई करने की कोशिश कर सकता हूं।
Dru

आह ... आपको केवल फ़ाइल नामों की आवश्यकता है? भागो: grep -R "touch" . | cut -d ":" -f 1 (क्षमा करें आपको गलत होना चाहिए)।
कारपूलिंग

धन्यवाद @carlspring यह दिलचस्प है। grepया तो सामग्री और फ़ाइल नाम वाली touchसामग्री या युक्त फ़ाइल देता है touch, मुझे यकीन नहीं है जो मामला है, अभी तक। लौटाई गई फ़ाइलों की सूची touchमें, शीर्षक में आधे भाग होते हैं और अन्य आधे touchशरीर में होते हैं, शीर्षक नहीं। बस यह एहसास हुआ।
Dru

5

-maxdepthविकल्प से पहले किया जाना चाहिए -nameविकल्प, नीचे की तरह।,

find . -maxdepth 1 -name "string" -print

1
आपको "स्ट्रिंग" से पहले और बाद में * डालना होगा।
एरिन

3
find $HOME -name "hello.c" -print

यह "hello.c" नामक किसी भी फाइल के लिए पूरे $HOME(यानी /home/username/) सिस्टम को खोजेगा और उनके पाथनाम को प्रदर्शित करेगा:

/Users/user/Downloads/hello.c
/Users/user/hello.c

हालांकि, यह मेल नहीं खाएगा HELLO.Cया नहीं HellO.C। मैच के लिए असंवेदनशील मामला -inameनिम्न प्रकार है:

find $HOME -iname "hello.c" -print

नमूना आउटपुट:

/Users/user/Downloads/hello.c
/Users/user/Downloads/Y/Hello.C
/Users/user/Downloads/Z/HELLO.c
/Users/user/hello.c

-type fकेवल फ़ाइलों की खोज करने का विकल्प पास करें:

find /dir/to/search -type f -iname "fooBar.conf.sample" -print
find $HOME -type f -iname "fooBar.conf.sample" -print

-inameजीएनयू या बीएसडी (ओएस एक्स सहित) संस्करण खोजने के आदेश पर या तो काम करता है। यदि आपके आदेश का संस्करण का समर्थन नहीं करता है -iname, तो grepकमांड का उपयोग करके निम्नलिखित सिंटैक्स आज़माएं :

find $HOME | grep -i "hello.c"
find $HOME -name "*" -print | grep -i "hello.c"

या प्रयास करें

find $HOME -name '[hH][eE][lL][lL][oO].[cC]' -print

नमूना आउटपुट:

/Users/user/Downloads/Z/HELLO.C
/Users/user/Downloads/Z/HEllO.c
/Users/user/Downloads/hello.c
/Users/user/hello.c

0

यदि स्ट्रिंग नाम की शुरुआत में है, तो आप ऐसा कर सकते हैं

$ compgen -f .bash
.bashrc
.bash_profile
.bash_prompt

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

0

पहले से ही प्रदान किए गए कई समाधानों का एक विकल्प ग्लोब का उपयोग कर रहा है **। जब आप bashविकल्प के साथ उपयोग करते हैं globstar( shopt -s globstar) या आप का उपयोग करते हैं zsh, तो आप इसके लिए ग्लोब का उपयोग कर सकते हैं **

**/bar

नाम की फ़ाइलों के लिए एक पुनरावर्ती निर्देशिका खोज करता है bar(संभावित रूप barसे वर्तमान निर्देशिका में फ़ाइल सहित )। यह याद रखें कि इसे उसी पथ खंड के भीतर ग्लोबिंग के अन्य रूपों के साथ नहीं जोड़ा जा सकता है; उस स्थिति में, *ऑपरेटर अपने सामान्य प्रभाव पर वापस लौट आते हैं।

ध्यान दें कि zshऔर bashयहाँ के बीच एक सूक्ष्म अंतर है। जबकि bashनिर्देशिकाओं के लिए नरम लिंक पार करेंगे, zshनहीं होगा। इसके लिए आपको ग्लोब उपयोग करने के लिए ***/में zsh



-2
grep -R "somestring" | cut -d ":" -f 1

2
यह एक अलग प्रश्न का उत्तर प्रतीत होता है - लेकिन क्योंकि आपने कोई स्पष्टीकरण नहीं दिया है, इसलिए यह पूछने वाले या किसी और के लिए स्पष्ट नहीं है।
टोबी स्पाइट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.