有沒有人知道從Linux控制檯執行快速模糊搜索的方法?Linux控制檯中的模糊文件搜索
當我需要在一個項目中找到一個文件但我不記得確切的文件名時,我經常遇到這種情況。在Sublime text editor中,我將按Ctrl-P並鍵入名稱的一部分,這將生成要從中進行選擇的文件列表。這是我非常滿意的一個驚人特性。問題是,在大多數情況下,我必須通過ssh在遠程機器的控制檯上瀏覽代碼。所以我想知道是否有類似於Linux控制檯的「Go Anywhere」功能的工具?
有沒有人知道從Linux控制檯執行快速模糊搜索的方法?Linux控制檯中的模糊文件搜索
當我需要在一個項目中找到一個文件但我不記得確切的文件名時,我經常遇到這種情況。在Sublime text editor中,我將按Ctrl-P並鍵入名稱的一部分,這將生成要從中進行選擇的文件列表。這是我非常滿意的一個驚人特性。問題是,在大多數情況下,我必須通過ssh在遠程機器的控制檯上瀏覽代碼。所以我想知道是否有類似於Linux控制檯的「Go Anywhere」功能的工具?
您可能會發現有用。這是一個用Go編寫的通用模糊查找器,可用於任何列表:文件,進程,命令歷史記錄,git分支等。
其安裝腳本將爲您的shell設置CTRL-T
鍵合。以下GIF顯示了它的工作原理。
我不知道你是多麼熟悉的終端,但是這可以幫助你:
find | grep 'report'
find | grep 'report.*2008'
很抱歉,如果你已經知道grep
並尋找一些更先進。
你可以做以下
grep -iR "text to search for" .
其中 「」作爲出發點,所以你可以不喜歡
grep -iR "text to search" /home/
這將使下/包含文本的家/和列表文件的每個文件中的給定文本的grep搜索。
我通常使用:
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 =汽車」)
如果搜索到的項目可能被隱藏,則可以使用如下替代命令: 'ls -laR | grep -i [模糊文件名]'(在R之前添加l(長格式)和a(所有文件,包括那些虛線文件))。 – Semo 2014-05-14 10:29:40
您可以使用找到這樣複雜的正則表達式:
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
的fasd shell腳本也許值得一看。
fasd
提供快速訪問POSIX shell的文件和目錄。它受到諸如autojump,z和v等工具的啓發.Fasd跟蹤您訪問的文件和目錄,以便您可以在命令行中快速引用它們。
它不同於一點點從所有文件的完整的發現,因爲它僅搜索最近打開的文件。但它仍然非常有用。
大多數這些答案不會做模糊搜索一樣崇高的文本做 - 他們可以匹配答案的一部分,但他們沒有做很好的「剛發現這所有的字母秩序'行爲。
我認爲這有點接近你想要的。我放在一起使用模糊搜索找到目標目錄的特殊版本的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))*
它創建模糊搜索字符串。
find . -iname '*foo*'
不區分大小寫查找包含foo
的文件名。
我不認爲這是'find'的正確用法。 – evanrmurphy 2014-02-21 16:40:53
正確的用法如...? – user1338062 2014-02-21 18:40:44
當我運行這個時,它會失敗,並發現'find:illegal option - i'。不過,我現在在Mac上。也許'find'在Mac和Linux之間的工作方式不同。 – evanrmurphy 2014-02-21 18:46:45
fd是一種簡單,快速和用戶友好的替代方法。從GitHub的項目頁面
演示:
是什麼主題? – potlee 2015-07-06 22:15:40
@potlee https://github.com/junegunn/seoul256.vim – 2015-07-07 05:23:17
聽起來不錯。你可以製作一個關於它的YouTube視頻嗎?我也想知道如何快速插入kill -9。 –
anonymous
2017-02-17 11:25:00