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

我有兴趣在终端中输入搜索关键字,并能够immediately interactively地查看输出结果。 这意味着,就像在谷歌搜索一样,我希望在键入每个字符或单词后立即获得结果。

我通过结合WATCH命令和FIND命令来做到这一点,但无法携带交互式通道。

让我们假设,在文件名中搜索名字为'hint'的文件,我使用该命令

$ find | grep -i hint

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

但是我想要的是交互式的相同行为,这意味着无需重新输入命令,只需输入SEARCH STRING。

我想写一个shell脚本,它从STDIN中读取并每1秒执行一次PIPED-COMMAND。 因此,我所输入的每一次都将其作为每次命令的指令。 但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 -s i
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 )。 Backspaces会将搜索字符串缩短一个,而按下Escape将退出脚本。 当前搜索字符串显示在顶部。 我使用-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> ,结果将变为final,并输出到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
链接地址: http://www.djcxy.com/p/27277.html

上一篇: How to achieve AJAX(interactive) kind of SEARCH in LINUX to FIND files?

下一篇: Are trailing commas in arrays and objects part of the spec?