2012-02-24 12 views
33

क्या कोई भी लिनक्स कंसोल से त्वरित फ़ज़ी खोज करने का तरीका जानता है?लिनक्स कंसोल में फ़ज़ी फ़ाइल खोज

अक्सर मुझे एक स्थिति में फ़ाइल खोजने की आवश्यकता होती है, लेकिन मुझे सटीक फ़ाइल नाम याद नहीं है। Sublime text editor में मैं Ctrl-P दबाता हूं और नाम का एक हिस्सा टाइप करता हूं, जो फ़ाइलों का चयन करने के लिए चयन करेगा। यह एक अद्भुत विशेषता है जिसके साथ मैं काफी खुश हूं। समस्या यह है कि ज्यादातर मामलों में मुझे एसएसएच के माध्यम से रिमोट मशीनों पर कंसोल में एक कोड ब्राउज़ करना होता है। तो मुझे आश्चर्य है कि लिनक्स कंसोल के लिए "गो कहीं भी" सुविधा जैसी कोई उपकरण है?

उत्तर

54

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

इसकी इंस्टॉल स्क्रिप्ट आपके खोल के लिए CTRL-T कीबाइंडिंग स्थापित करेगी। निम्नलिखित जीआईएफ दिखाता है कि यह कैसे काम करता है।

+0

वह विषय क्या है? – potlee

+1

@potlee https://github.com/junegunn/seoul256.vim –

+0

अच्छा लगता है। क्या आप इसके बारे में यूट्यूब वीडियो बना सकते हैं? मैं यह भी जानना चाहता हूं कि आप कितनी जल्दी हत्या -9 डालते हैं। – anonymous

0

आप AGREP या TRE नियमित अभिव्यक्ति लाइब्रेरी का उपयोग करने वाले कुछ और कोशिश कर सकते हैं।

+2

यही समझा कि क्यों वह TRE regex का उपयोग करना चाहेंगे बिना बहुत अस्पष्ट है। यह क्या पेशकश करता है कि ईआरई या पीसीआरई नहीं करता है? – jordanm

0

मैं कैसे परिचित आप टर्मिनल के साथ कर रहे हैं पता नहीं है, लेकिन यह तुम्हारी मदद कर सकता:

find | grep 'report' 
find | grep 'report.*2008' 

क्षमा करें अगर आप पहले से grep जानते हैं और अधिक उन्नत कुछ देख रहे थे।

+5

यह वास्तव में नहीं है कि आप कैसे उपयोग करते हैं। 'ढूंढें का प्रयोग करें। -नाम 'रिपोर्ट * 2008''। –

+0

@ क्रिस आपको शैल को विस्तार से रोकने के लिए अपने खोज पैटर्न को उद्धृत करने की आवश्यकता है। बिंदु के लिए +1। – jordanm

+0

@Chris यह वह नहीं है जिसे मैं ढूंढ रहा था लेकिन 'ढूंढने में क्या गलत है। grep 'रिपोर्ट। * 2008' फार्म? – nab

1

आप निम्न

grep -iR "text to search for" . 

जहां कर सकते हैं "।" प्रारंभिक बिंदु जा रहा है, तो आप की तरह

grep -iR "text to search" /home/ 

यह कुछ कर सकते हैं के तहत/घर/और सूची फ़ाइलें जो कि पाठ शामिल हर फ़ाइल के अंदर दिए गए पाठ के लिए ग्रेप खोज कर देगा।

3

मैं आमतौर पर उपयोग करें:

ls -R | grep -i [whatever I can remember of the file name] 

मैं कहाँ फ़ाइल होने की उम्मीद के ऊपर एक निर्देशिका से - उच्च ऊपर आप निर्देशिका वृक्ष में जाना, धीमी यह जाना जा रहा है।

जब मैं सटीक फ़ाइल नाम मिल जाए, मैं इसे खोजने में उपयोग करें:

find . [discovered file name] 

यह एक लाइन में ढह जा सकता है:

for f in $(ls --color=never -R | grep --color=never -i partialName); do find -name $f; done 

(मैं ls और ग्रेप के साथ एक समस्या पाया

: "--color = ऑटो")

+0

यदि खोजा गया आइटम छुपाया जा सकता है, तो आप वैकल्पिक आदेश जैसे: 'ls -laR | grep -i [अस्पष्ट फ़ाइल नाम] '(जोड़ा एल (लंबा प्रारूप) और एक (सभी फाइलें, उन बिंदीदार फाइलों सहित) आर से पहले)। – Semo

0

आप जटिल regex के लिए इस तरह लगता है इस्तेमाल कर सकते हैं पर एलियास किया जा रहा है

या इस सरल ग्लोब की तरह मैचों के लिए:

find . -type f -name "*YOUR_PARTIAL_NAME*" -print

या आप भी इस्तेमाल कर सकते हैं find2perl (जो काफी तेजी से और अधिक को खोजने से अनुकूलित है), इस तरह:

find2perl . -type f -name "*YOUR_PARTIAL_NAME*" -print | perl

यदि आप देखना चाहते हैं कि पर्ल इसे कैसे करता है, तो | perl भाग हटा दें और आप इसे उत्पन्न कोड देखेंगे। रास्ते से सीखने के लिए यह एक बहुत अच्छा तरीका है।

वैकल्पिक रूप से, इस तरह एक त्वरित बैश आवरण लिखते हैं, और इसे कहते है जब भी आप चाहते हैं:

#! /bin/bash 
FIND_BASE="$1" 
GLOB_PATTERN="$2" 
if [ $# -ne 2 ]; then 
    echo "Syntax: $(basename $0) <FIND_BASE> <GLOB_PATTERN>" 
else 
     find2perl "$FIND_BASE" -type f -name "*$GLOB_PATTERN*" -print | perl 
fi 

नाम qsearch की तरह यह कुछ और फिर इसे इस तरह कहते हैं: qsearch . something

5

fasd खोल स्क्रिप्ट है शायद एक नज़र डालने लायक है।

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

यह सभी फ़ाइलों की एक पूरी खोजने से थोड़ा अलग है क्योंकि यह केवल हाल ही में खोला फ़ाइलें खोज करता है। हालांकि यह अभी भी बहुत उपयोगी है।

4

इन उत्तरों से अधिकांश उदात्त पाठ की तरह खोजने फजी काम नहीं चलेगा यह होता है - वे जवाब का हिस्सा मेल खा सकता है, लेकिन वे 'अच्छा सिर्फ इस में सभी पत्र लगता है ऐसा नहीं करते हैं आदेश 'व्यवहार।

मुझे लगता है कि यह आपके इच्छित चीज के करीब है। मैंने एक साथ सीडी ('एफसीडी') का एक विशेष संस्करण रखा है जो लक्ष्य निर्देशिका खोजने के लिए अस्पष्ट खोज का उपयोग करता है। सुपर सरल - बस अपने bashrc से जोड़ें:

function joinstr { local IFS="$1"; shift; echo "$*"; } 
function fcd { cd $(joinstr \* $(echo "$*" | fold -w1))* } 

इस इनपुट में प्रत्येक अक्षर के बीच एक * जोड़ देगा, इसलिए यदि मैं, पर जाने के लिए उदाहरण के लिए चाहते हैं,

/home/dave/results/sample/today 

मैं कर सकते हैं बस टाइप निम्न में से किसी:

fcd /h/d/r/spl/t 
fcd /h/d/r/s/t 
fcd /h/d/r/sam/t 
fcd /h/d/r/s/ty 

एक उदाहरण के रूप में पहली का उपयोग करना, इस cd /*h*/*d*/*r*/*s*p*l*/*t* निष्पादित और खोल तरह बाहर क्या वास्तव में से मेल खाता है करने देगा।

जब तक पहला अक्षर सही होता है, और पथ में प्रत्येक निर्देशिका से एक पत्र लिखा जाता है, तो आप जो खोज रहे हैं उसे वह मिल जाएगा। शायद आप इसे अपनी जरूरतों के लिए अनुकूलित कर सकते हैं? महत्वपूर्ण बात यह है:

$(joinstr \* $(echo "$*" | fold -w1))* 

जो अस्पष्ट खोज स्ट्रिंग बनाता है। foo युक्त फ़ाइल नामों की

+2

एफवाईआई, एफजीएफ (अन्य टिप्पणी से) ठीक है, कमांड इतिहास, फ़ाइल लिस्टिंग के लिए, और जो भी अतिरिक्त चीज आप इसमें पाइप करना चाहते हैं। बोनस: लाइव अपडेट, हाइलाइटिंग और धीरे-धीरे एसिंक इंडेक्सिंग (जब आप 30k फ़ाइलों की निर्देशिका से मेल खाते हैं तो ब्लॉक नहीं होते हैं)। – chenglou

+0

सहमत! चूंकि उस उत्तर को लिखने के बाद से मैं कहीं भी fzf भर में ठोकर खाई, और अब मैं यही उपयोग करता हूं। महान उपकरण। – dlonie

1
find . -iname '*foo*' 

मामले असंवेदनशील खोज।

+0

मुझे नहीं लगता कि यह 'ढूंढ' का सही उपयोग है। – evanrmurphy

+1

सही उपयोग के रूप में ...? – user1338062

+0

जब मैं इसे चलाता हूं, तो यह 'ढूंढने में विफल रहता है: अवैध विकल्प - i'। मैं अभी मैक पर हूं हालांकि। शायद 'ढूंढें' मैक और लिनक्स के बीच अलग-अलग काम करता है। – evanrmurphy

0

fd खोजने के लिए एक सरल, तेज़ और उपयोगकर्ता के अनुकूल विकल्प है।GitHub परियोजना पृष्ठ से

डेमो: