我正在寻找一种轻量级的解决方案来帮助用户在我的服务器上查找文件。
在命令行中运行,我只需使用locate,如果需要,可以使用grep命令。但是,用户无法访问提示符,也不知道如何使用更复杂的管道命令。
我一直在尝试使用一些搜索引擎,如solr和opensearch,但是这些搜索引擎对具有大量数据的全高清资源要求很高,而大多数时候,简单的名称搜索就足够了。
有人知道可以利用现有 locatedb 的 Web GUI 吗?
或者另一种方法,例如轻量级搜索引擎,只需很少的设置工作量和有限的资源需求,使用中央搜索数据库并为不同的平台提供 GUI?
答案1
更新,2018年1月22日:
我偶然发现mlocate-web在 GitHub 上,它非常符合 OP 的要求,尽管缺乏打开文件的能力。可以手动运行或作为守护进程运行。根据 README.md,该软件包是在 Ubuntu 16.04 上开发的,所以到目前为止它还是相当新的。
2 月 2 日小更新
在 中添加双引号gnome-open "$TOPEN"
,以便 gnome-open 获取包含空格的文件的完整路径名。
更新 # 2,1 月 30 日:
根据评论中的要求,我改进了脚本,并添加了打开文件的选项。一切都通过 zenity、locate 和 gnome-open 实现。赞扬 Unix 将命令传递到其他命令的哲学!
我已经注释了脚本,因此应该清楚在哪里、什么以及如何。在屏幕截图中,我打开了 Java 的 Hello World 程序。如果用户单击“取消/退出”按钮,脚本就会随时退出。
附注:原作者要求该应用应跨平台。据我所知,zenity、gnome-open 和locate 不依赖于 GNOME shell 的存在。此外,用户将连接到他的 Ubuntu 服务器,并且无论 GNOME shell 是否存在,所有这些应用都可以在 Ubuntu 上运行。换句话说,他们将在他的系统上执行脚本,而不是在他们的系统上,以定位文件。
完善后的脚本:
#!/bin/bash
# Author: Serg
# Description: GUI using zenity for locate utility
# Date: January 30, 2015
# This flag will make popup appear if nothing was found
FOUND=0
# Ask user for input, and store it in USRFILE variable
USRFILE=`zenity --entry --title="SEARCH" --entry-text="Text here" --text="Enter a filename or part of it"`
# if use clicked OK, proceed to this big if statement
if [ $(echo $?) = 0 ]
then
TOPEN=$( ( locate $USRFILE ) | ( zenity --height 450 --width=450\
--list --column "Please wait, I'll display paths to files, if I find any"\
--title "SEARCH RESULTS" --text "Select a file you want to open"\
--height=450 --width=450 --ok-label="Open a file " --cancel-label="Quit" ) )
# FIXME: if user clicks open a file without selecting one, program will crash
# FIXME: selecting a file and hitting enter, brings up "Nothing found" dialog
# If user clicked "Open a file" , gnome-open
# will open it with whatever default
# program is listed for that file-type
if [ $(echo $?) = 0 ]
then
gnome-open "$TOPEN"
fi
# Set flag to true, do not display "Nothing found"
if [ $(echo $?) = 0 ]
then FOUND=1
fi
# If we didn't find anything, display a message
if [ $FOUND != 1 ]
then zenity --info --text="Nothing found"
fi
fi
改进截图
获取用户输入 显示搜索结果(如果有),可能需要一些时间才能加载 打开选定的文件
有关如何使用快捷方式(双击)打开此脚本的建议,请参阅下面我之前的更新
更新 #1,1 月 29 日:请忽略我之前的帖子。我考虑过你对问题的表述方式:“一个用于定位的 GUI 前端”。事实上,存在一个用于脚本的 GUI 前端,zenity
我已经使用它草拟了一个可能有用的脚本。您可以随意修改它并添加功能,但最基本的级别是使用 GUI 进行定位。
至于使脚本“可双击”请参阅这里
剧本
#!/bin/bash
FOUND=0
USRFILE=`zenity --entry --entry-text="Text here" --text="Enter a filename or part of it"`
zenity --info --text " Please wait a little, I'll try to find it "
locate $USRFILE > results.txt && zenity --text-info --html --filename='results.txt'
if [ -e results.txt ]
then FOUND=1
rm results.txt
fi
if [ $FOUND != 1 ]
then zenity --info --text="Nothing found"
fi
截图
旧帖
有gnome-search-tool
,我已经用ps
和htop
实用程序检查过了,它不会占用太多资源。你可以用 来安装它sudo apt-get install gnome-search-tool
。
答案2
答案3
我知道这个问题已经很老了,但我发现自己也在问同样的问题,关于 Raspberry Pi 上的一些冷存储。我想出了一个使用 CGI 的超级简单解决方案,但要小心——安全性不是它的强项。只将其用于个人系统或私人网络,因为它很容易受到注入攻击。好消息是,如果您已经安装了 Apache/NGinx,它可以快速轻松地部署。
搜索.html:
<HTML>
<TITLE>MLocate Web Form</TITLE>
<BODY>
<b>Simple Web Form</b><p>
<FORM ACTION="/cgi-bin/search.cgi" target="resultsframe">
<label for="search">Find</label>
<INPUT TYPE="TEXT" NAME="search" SIZE="50"><BR>
<label for="limit">Limit</label>
<INPUT TYPE="TEXT" NAME="limit" value="10" SIZE="4"><BR>
<INPUT TYPE="SUBMIT" NAME="Find" VALUE="Find">
</FORM>
<iframe name="resultsframe" height=600 width=800></iframe>
</BODY>
</HTML>
现在您可以使用 CGI 从 bash 脚本 (/var/www/cgi-bin/search.cgi) 转储结果:
#!/bin/bash
echo -e 'Content-type: text/html\n\n'
echo '<html><body><table>'
eval $(echo $QUERY_STRING | sed 's/\&/\n/g')
while read -r l
do
l=${l:8}
echo "<tr><td><a href='[YOUR_HTTP_BASE]$l'>$l</td></tr>"
done <<< $(locate -l "$limit" -i "$search")
echo "</table></html>"
结果以链接形式发布,因此请过滤并将结果映射到您想要的 apache 允许的路径。如果您有 unicode 或 html-iffy 字符,最好将其转义。另请注意,您可能会在此处将恶意内容注入您的搜索中,因此请自行承担风险或对输入进行消毒。
答案4
我使用 zenity。通过 Thunar 配置文件夹中的文本搜索
如果有人能帮助我,我就会很高兴
#!/bin/bash
# Author: Karavaev Viktor E. (Russia)
# Description: GUI using zenity for locate search file Thunar
# Using Thunar: ~/.config/Thunar/find_file_thunar.sh %f
# Using: ~/.config/Thunar/find_file_thunar.sh /home/user/dir/
# Date: June 05, 2020
# print debug strings
debug=0
# Find is dir
FINDSTR=$1
if [ $debug = 1 ]
then
echo $FINDSTR
fi
# open window without exit
zenity_list()
{
TOPEN=$( zenity --height=400 --width=450 \
--list --column "Files" \
--title "Result" --text "Select the file you want to open" \
--ok-label="Open" --cancel-label="Close" --separator=";" $list )
if [ $(echo $?) = 0 ]
then
if [ "$debug" = 1 ]
then
echo "TOPEN: $TOPEN \n"
fi
# Open select file this program ( i like geany ;) )
geany "$TOPEN"
zenity_list
fi
}
# Find is dir exist
if [ -n "$FINDSTR" ]
then
# This flag will make popup appear if nothing was found
FOUND=0
cd $FINDSTR
# Ask user for input, and store it in USRFILE variable
USRFILE=`zenity --entry --title="Search" --entry-text="" --text="search text"`
if [ "$debug" = 1 ]
then
# dir search command
grep -rnwil "$USRFILE"
fi
# if use clicked OK, proceed to this big if statement
if [ $(echo $?) = 0 ]
then
list=$( grep -rnwil "$USRFILE" )
if [ "$debug" = 1 ]
then
echo "list finds: $list \n"
fi
zenity_list
# Set flag to true, do not display "Nothing found"
if [ $(echo $?) = 0 ]
then FOUND=1
fi
fi
# If we didn't find anything, display a message
if [ "${#list[@]}" = 0 ]
then
if [ "$debug" = 1 ]
then
echo "Not found \n"
fi
zenity --height=100 --width=200 --info --text="Not found "
fi
if [ "$debug" = 1 ]
then
echo "flag FOUND result: $FOUND \n"
fi
else
if [ "$debug" = 1 ]
then
echo "Parameters were not found. \n"
fi
zenity --height=100 --width=200 --info--text="Parameters were not found."
fi