在没有locate
安装的小型系统上,别名如何获得与locate相同的结果?
我可以想象find
可以产生相同的输出,因此别名可能看起来像
alias locate="find / -name"
但这似乎与locate 的工作原理不同:
locate test
只会查找具有该名称的文件确切地在locate时调用test
将找到包含该文件的所有文件。
解决方法
使用:
locate *test*
答案1
为了改善对查找速度的巨大影响,您可以模拟类似定位之类的东西
alias locate="if [ ! -e /tmp/locate.db -a ! -e /tmp/locate.lockdb ]
then touch /tmp/locate.lockdb
trap \"rm /tmp/locate.lockdb; rm /tmp/locate.db; exit\" SIGHUP SIGINT SIGTERM
find /|tee /tmp/locate.db
chmod 666 /tmp/locate.db
rm /tmp/locate.lockdb
elif [ -e /tmp/locate.lockdb ]
then find /
else cat /tmp/locate.db
fi|grep "
当然是权限问题!最好为数据库编写一些 setuid 命令,tee
并cat
以超级用户模式和更好的位置写入数据库,但是/tmp
。
locate.db
在大多数单用户或少数用户系统上,一个廉价的替代方案是在靠近 的地方编写每个用户$HOME
。
另一个不错的别名是能够更新/查找。嗯,最后我认为这个别名比原来的定位更好;)
alias relocate="if [ ! -e /tmp/locate.lockdb ]
then rm /tmp/locate.db
fi
locate "
编辑 实际上,我认为重新定位应该像上面的定位别名一样使用。如果您使用不带参数的重定位,则会出现错误。这个想法是relocate "no file to search for"
如果您不想搜索而只想更新数据库时使用。
好的,该查找也必须被设置。但随后你可以扔掉你的定位包。grep
应传递参数以sed
引用.
点。
菜鸟注意事项: 当我在这里谈论 setuid 时不要在类似工具上设置 SETUID 标志 tee
,cat
或者find
。这将是您系统的安全漏洞!我的意思是为这些在 setuid 模式下工作并以受限方式工作的简单命令编写安全的替代方案,只是为了为此别名提供合适的工具。
答案2
function locate_f()
{
find / -path "*$1*" //Edit:path (as Gilles stated)
}
alias locate=locate_f
答案3
尝试
alias locate="find / | grep "
这应该与locate完全一样 - 但当然它会慢得多
答案4
1)为所有用户全局添加别名
echo 'alias locate="grep $1 /var/locate/locate.db"' >> /etc/bashrc
你基本上可以将它指向一个 shell 脚本,你可以在其中进行更直观的参数选择...如果你只是在寻找非常简单的搜索,这应该足够了。
2) 添加 Cron Job 每天运行。
/etc/cron.daily
#!bin/bash
if [[ ! -d /var/locate ]]; then
mkdir /var/locate
fi
locatedb=/var/locate/locate.db
rm -f $locatedb
for DIRS in `ls /|grep -v "proc"`
do
find /$DIRS -type f >> $locatedb 2>&1 /dev/null
done
您将获得与 mlocate 相同的结果,无需安装 mlocate...我刚刚在 CentOS 上进行了测试...结果几乎完全相同。