2012-02-24 29 views
33

有沒有人知道從Linux控制檯執行快速模糊搜索的方法?Linux控制檯中的模糊文件搜索

當我需要在一個項目中找到一個文件但我不記得確切的文件名時,我經常遇到這種情況。在Sublime text editor中,我將按Ctrl-P並鍵入名稱的一部分,這將生成要從中進行選擇的文件列表。這是我非常滿意的一個驚人特性。問題是,在大多數情況下,我必須通過ssh在遠程機器的控制檯上瀏覽代碼。所以我想知道是否有類似於Linux控制檯的「Go Anywhere」功能的工具?

回答

54

您可能會發現​​有用。這是一個用Go編寫的通用模糊查找器,可用於任何列表:文件,進程,命令歷史記錄,git分支等。

其安裝腳本將爲您的shell設置CTRL-T鍵合。以下GIF顯示了它的工作原理。

+0

是什麼主題? – potlee 2015-07-06 22:15:40

+1

@potlee https://github.com/junegunn/seoul256.vim – 2015-07-07 05:23:17

+0

聽起來不錯。你可以製作一個關於它的YouTube視頻嗎?我也想知道如何快速插入kill -9 。 – anonymous 2017-02-17 11:25:00

0

您可能想嘗試 AGREP或使用TRE正則表達式庫的其他東西。

+2

這是沒有解釋他爲什麼要使用正則表達式TRE很模糊。 ERE或PCRE沒有提供什麼? – jordanm 2012-02-24 23:18:45

0

我不知道你是多麼熟悉的終端,但是這可以幫助你:

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

很抱歉,如果你已經知道grep並尋找一些更先進。

+5

這真的不是你如何使用find。使用'find。名'報告* 2008'。 – 2012-02-24 23:14:18

+0

@Chris您需要引用您的搜索模式以防止shell擴展glob。對於所提出的觀點+1。 – jordanm 2012-02-24 23:17:35

+0

@Chris這不是我正在尋找的東西,但是'find | grep'report。* 2008'' form? – nab 2012-02-24 23:31:00

1

你可以做以下

grep -iR "text to search for" . 

其中 「」作爲出發點,所以你可以不喜歡

grep -iR "text to search" /home/ 

這將使下/包含文本的家/和列表文件的每個文件中的給定文本的grep搜索。

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和grep問題被化名爲「--color =汽車」)

+0

如果搜索到的項目可能被隱藏,則可以使用如下替代命令: 'ls -laR | grep -i [模糊文件名]'(在R之前添加l(長格式)和a(所有文件,包括那些虛線文件))。 – Semo 2014-05-14 10:29:40

0

您可以使用找到這樣複雜的正則表達式:

find . -type f -regextype posix-extended -iregex ".*YOUR_PARTIAL_NAME.*" -print

還是這對simplier水珠般的比賽:

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

或者你也可以使用find2perl(這比發現是相當更快,更優化的),像這樣:

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

如果你只是想看看Perl是如何做到的,請刪除| perl部分,你會看到它生成的代碼。這是一種很好的方式來學習。

另外,編寫一個簡單的bash的包裝就是這樣,並調用它,只要你想:

#! /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 shell腳本也許值得一看。

fasd提供快速訪問POSIX shell的文件和目錄。它受到諸如autojump,z和v等工具的啓發.Fasd跟蹤您訪問的文件和目錄,以便您可以在命令行中快速引用它們。

它不同於一點點從所有文件的完整的發現,因爲它僅搜索最近打開的文件。但它仍然非常有用。

4

大多數這些答案不會做模糊搜索一樣崇高的文本做 - 他們可以匹配答案的一部分,但他們沒有做很好的「剛發現這所有的字母秩序'行爲。

我認爲這有點接近你想要的。我放在一起使用模糊搜索找到目標目錄的特殊版本的cd('fcd')。超級簡單 - 只需添加到您的.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))* 

它創建模糊搜索字符串。

+2

僅供參考,fzf(來自其他評論)完全是這樣,對於命令歷史,文件列表以及任何想要管理的額外內容。獎金:實時更新,突出顯示和漸進式異步索引(當您模糊匹配30k文件目錄時不會阻止)。 – chenglou 2015-01-18 05:07:40

+0

同意!自寫這個答案以來,我一路上偶然發現了fzf,現在就是我所使用的。偉大的工具。 – dlonie 2015-06-04 15:34:21

1
find . -iname '*foo*' 

不區分大小寫查找包含foo的文件名。

+0

我不認爲這是'find'的正確用法。 – evanrmurphy 2014-02-21 16:40:53

+1

正確的用法如...? – user1338062 2014-02-21 18:40:44

+0

當我運行這個時,它會失敗,並發現'find:illegal option - i'。不過,我現在在Mac上。也許'find'在Mac和Linux之間的工作方式不同。 – evanrmurphy 2014-02-21 18:46:45

0

fd是一種簡單,快速和用戶友好的替代方法。從GitHub的項目頁面

演示: