如何在LINUX中实现AJAX(interactive)类SEARCH查找文件?

我有兴趣在terminal中inputsearch关键字,并能够immediately interactively地看到输出。 这意味着,就像在google中search一样,我希望在每个字符或单词input后立即获得结果。

我把WATCH命令和FIND命令结合起来,但是无法带来交互式的通话。

让我们假设,在文件名中search名字为'hint'的文件,我使用这个命令

 $ find | grep -i hint 

这几乎给了我体面的输出结果。

但我想要的是相同的行为交互,这意味着没有重新键入命令,但只inputSEARCH STRING。

我想写一个shell脚本,它从STDIN中读取并每1秒执行一次上面的PIPED-COMMAND。 因此,我所input的每一个命令都需要它作为一个指令。 但WATCH命令不是交互式的。

我感兴趣的是下面那种OUTPUT:

 $ hi ./hi ./hindi ./hint $ hint ./hint 

如果任何人都可以用更好的替代方法来替代我的PSUEDO CODE,那也不错

偶然发现这个老问题,发现它很有趣,并且认为我会试一试。 这BASH脚本为我工作:

 #!/bin/bash # Set MINLEN to the minimum number of characters needed to start the # search. MINLEN=2 clear echo "Start typing (minimum $MINLEN characters)..." # get one character without need for return while read -n 1 -si do # get ascii value of character to detect backspace n=`echo -n $i|od -i -An|tr -d " "` if (( $n == 127 )) # if character is a backspace... then if (( ${#in} > 0 )) # ...and search string is not empty then in=${in:0:${#in}-1} # shorten search string by one # could use ${in:0:-1} for bash >= 4.2 fi elif (( $n == 27 )) # if character is an escape... then exit 0 # ...then quit else # if any other char was typed... in=$in$i # add it to the search string fi clear echo "Search: \""$in"\"" # show search string on top of screen if (( ${#in} >= $MINLEN )) # if search string is long enough... then find "$@" -iname "*$in*" # ...call find, pass it any parameters given fi done 

希望这样做你打算(编)做。 我包括一个“开始目录”选项,因为如果你搜索整个主文件夹或者其他东西,这些列表可能会变得非常笨拙。 只要转储$1如果你不需要它。 在$n使用ascii值应该很容易包含一些热键功能,如退出或保存结果。

编辑:

如果您启动脚本,它将显示“开始输入…”并等待按键被按下。 如果搜索字符串足够长(由变量MINLEN定义),则任何按键都将触发使用当前搜索字符串的find运行( grep看起来有点冗余)。 该脚本通过给定的任何参数来find 。 这允许更好的搜索结果和更短的结果列表。 例如-type d将限制搜索到目录, -xdev将保留在当前文件系统上的搜索等(见man find )。 退格将缩短搜索字符串1,而按退出将退出脚本。 当前的搜索字符串显示在最上面。 我用-iname搜索是不区分大小写的。 将其更改为`-name'以获取区分大小写的行为。

下面的代码将stdin输入作为stdin ,过滤方法作为"$1"的宏,输出转到stdout

你可以使用它,例如,如下所示:

 #Produce basic output, dynamically filter it in the terminal, #and output the final, confirmed results to stdout vi `find . | terminalFilter` 

默认的过滤宏是grep -F "$pattern" ,脚本提供的模式变量是当前输入的内容。 作为当前输入内容的函数的即时结果显示在终端上。 当按<Enter> ,结果变成最终的,并输出到stdout

 #!/usr/bin/env bash ##terminalFilter del=`printf "\x7f"` #backspace character input="`cat`" #create initial set from all input #take the filter macro from the first argument or use # 'grep -F "$pattern"' filter=${1:-'grep -F "$pattern"'} pattern= #what's inputted by the keyboard at any given time printSelected(){ echo "$input" | eval "$filter" } printScreen(){ clear printSelected #Print search pattern at the bottom of the screen tput cup $(tput lines); echo -n "PATTERN: $pattern" } >/dev/tty #^only the confirmed results go `stdout`, this goes to the terminal only printScreen #read from the terminal as `cat` has already consumed the `stdin` exec 0</dev/tty while IFS=$'\n' read -s -n1 key; do case "$key" in "$del") pattern="${pattern%?}";; #backspace deletes the last character "") break;; #enter breaks the loop *) pattern="$pattern$key";; #everything else gets appended #to the pattern string esac printScreen done clear printSelected