首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当有来自管道的输入时,dmenu如何显示输入?

当有来自管道的输入时,dmenu如何显示输入?
EN

Stack Overflow用户
提问于 2020-06-01 14:05:07
回答 1查看 425关注 0票数 0

TL;DR

以下是默认行为。

代码语言:javascript
复制
find ~/ -name *.git 2>/dev/null | dmenu
# Searches everything in home directory and shows output

耗时约1-2秒

我想要的:

代码语言:javascript
复制
find ~/ -name *.git 2>/dev/null | less
# Show as soon as it finds result. How to get similar output in dmenu?

由于我电脑中的文件将会增加,这将需要更长的时间。

详细说明:

我通过管道将find命令的输入输入到dmenu中,这需要大约1-2秒的时间。是否可以让dmenu在管道中有一些输入时立即显示输入。因为这是管道的基本工作原理。看起来dmenu在等待,直到管道中的所有条目都有了,这样用户就可以从管道中进行搜索,这看起来也是合法的,但这仍然可以避免吗?我想只要缓冲区中有输入就运行dmenu

EN

回答 1

Stack Overflow用户

发布于 2020-06-11 14:20:33

我在这里找到了一些解决方法来减少对find的时间。可以使用locate代替find。所以这个命令是这样的

代码语言:javascript
复制
locate -r '/home'"$USER"'.*\.git$'

-r接受正则表达式的输入。这里的-r参数会过滤/home/$USER中的所有git存储库。这比使用find要快一点。

使用locate捕获

locate使用本地数据库进行搜索。因此,只有在构建/更新本地数据库时,它才能按预期工作。

要更新数据库,请使用sudo updatedb。每当您添加/移动/删除文件(或本例中的目录)时,请记住为locate更新数据库以提供正确的结果。

提示

为了避免每次都为updatedb (和其他常用命令)输入密码,可以通过执行sudo visudo并为命令的二进制文件位置添加路径条目来将它们添加到sudoers

更新

我最近意识到,当我可以简单地维护自己的数据库并将所有条目cat到dmenu中时,为什么要使用locate。有了这个,我就能够实现我所需要的。

代码语言:javascript
复制
# Make a temp directory
 mkdir -p $HOME/.tmp
# Search for all git directories and store them in ~/.tmp/gitfies. 
[ -e $HOME/.tmp/gitfiles ] || find $HOME/ -regex .*/\.git$ -type d 2>/dev/null > $HOME/.tmp/gitfiles
# cat this file into dmenu
cat $HOME/.tmp/gitfiles | dmenu

这给出了带有dmenu的目录的模糊查找。这比使用locate更好,因为即使在locate中,您也需要在这里更新本地数据库。因为我们使用locate在运行时过滤git文件,所以它比本例慢一点。

我可以简单地创建一个别名来更新这个数据库,类似于locate中的sudo updatedb,方法是

代码语言:javascript
复制
alias gitdbupdate="find $HOME/ -regex .*/\.git$ -type d 2>/dev/null > $HOME/.tmp/gitfiles"

请注意,我没有使用/tmp/,因为它不会在电源周期中持久存在。因此,我创建了自己的$HOME/.tmp/目录。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62126543

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档