TL;DR
以下是默认行为。
find ~/ -name *.git 2>/dev/null | dmenu
# Searches everything in home directory and shows output耗时约1-2秒
我想要的:
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。
发布于 2020-06-11 14:20:33
我在这里找到了一些解决方法来减少对find的时间。可以使用locate代替find。所以这个命令是这样的
locate -r '/home'"$USER"'.*\.git$'-r接受正则表达式的输入。这里的-r参数会过滤/home/$USER中的所有git存储库。这比使用find要快一点。
使用locate捕获
locate使用本地数据库进行搜索。因此,只有在构建/更新本地数据库时,它才能按预期工作。
要更新数据库,请使用sudo updatedb。每当您添加/移动/删除文件(或本例中的目录)时,请记住为locate更新数据库以提供正确的结果。
提示
为了避免每次都为updatedb (和其他常用命令)输入密码,可以通过执行sudo visudo并为命令的二进制文件位置添加路径条目来将它们添加到sudoers
更新
我最近意识到,当我可以简单地维护自己的数据库并将所有条目cat到dmenu中时,为什么要使用locate。有了这个,我就能够实现我所需要的。
# 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,方法是
alias gitdbupdate="find $HOME/ -regex .*/\.git$ -type d 2>/dev/null > $HOME/.tmp/gitfiles"请注意,我没有使用/tmp/,因为它不会在电源周期中持久存在。因此,我创建了自己的$HOME/.tmp/目录。
https://stackoverflow.com/questions/62126543
复制相似问题