如何在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?