Linux系统上一个很有用的,但不一定会出现在别的Unix版本上的命令是 locate。该命令会搜索一个预建的文件名数据库来查找特定的正则表达式。要是想要快速查找主要的.cshrc文件的位置呢?下面的是用locate的解决方法:
1 locate .cshrc 2 /.Trashes/501/Previous Systems/private/etc/csh.cshrc 3 /OS9 Snapshot/Staging Archive/:home/taylor/.cshrc 4 /private/etc/csh.cshrc 5 /Users/taylor/.cshrc 6 /Volumes/110GB/WEBSITES/staging.intuitive.com/home/mdella/.cshrc
你会发现在Mac OS X系统上,主要的.cshrc文件是在/private/etc目录下。locate系统在建立它自己内部的文件索引时会查看磁盘上的每个文件,不管这个文件是在垃圾队列中,还是独立的,或是一个隐藏的点文件。这种找文件的方法很简单,步骤上分为2个部分。第一个部分是通过调用find建立所有文件的数据库,第二部分是对这个新数据库进行一个简单的grep操作。
代码:
1 #!/bin/sh 2 3 # mklocatedb.sh -- 使用find建立locate数据库。 4 # 必须是root用户运行这个脚本 5 6 locatedb="/var/locate.db" 7 8 if [ "$(whoami)" != "root" ]; then 9 echo "Must be root to run this command." >&2 10 exit 1 11 fi 12 13 find / -print > $locatedb 14 15 exit 0
第二个脚本更短:
1 #!/bin/sh 2 3 # locate.sh -- 搜索locate数据库来查找给定的模式 4 5 locatedb="/var/locate.db" 6 7 exec grep -i "$@" $locatedb
脚本如何工作:
mklocatedb.sh脚本必须是root用户才能跑,这点上可以通过whoami命令很容易的测试出来,之所以必须是root用户,是为了保证能查看系统上的所有文件。root权限跑任何的脚本,不管怎样都会有安全问题。因为,如果一个目录对于一个特定的用户是关闭的,那么locate数据库就不应该存储有关这个目录或是它里面内容的任何信息。这点下章会有详述,会使用一个新的安全的locate脚本,会检查账户的 隐私性和安全性。可现在嘛,这个脚本在Linux、Mac OS X和其它版本上精确的模仿了locate命令的行为。如果mklocatedb.sh花了好几分钟甚至更长的时间来运行,要知道,它遍历了整个系统,就算是在一个中型系统上这也要花费好一会了。运行的结果可能会很大。在我的Mac OS X系统上,locate.db文件有超过380,000的数目,并且吃掉了18.3MB的磁盘空间。一旦数据库被建立好了,那么locate脚本自身就很容易写了,因为它仅仅是调用grep命令,参数则是由用户提供的。
运行脚本:
为了允许locate脚本,首先要运行mklocate.sh脚本。一旦它运行完毕后,locate.sh会查明系统上所有可以匹配特定模式的文件。
运行结果:
mklocate.db 脚本没有参数,也没有输出:
1 $ sudo mklocatedb 2 Password: 3 $
你可以用ls看下数据库文件有多大:
1 $ ls -l /var/locate.db 2 -rw-r--r-- 1 root wheel 42384678 Mar 26 10:02 /var/locate.db
为了在系统上查找到文件,使用locate命令:
1 $ locate.sh -i gammon 2 /OS9/Applications (Mac OS 9)/Palm/Users/Dave Taylor/Backups/Backgammon.prc 3 /Users/taylor/Documents/Palm/Users/Dave Taylor/Backups/Backgammon.prc 4 /Users/taylor/Library/Preferences/Dave's Backgammon Preferences 5 /Volumes/110GB/Documents/Palm/Users/Dave Taylor/Backups/Backgammon.prc
脚本同样可以让你发现系统上别的有趣的分布,比如有多少.c文件:
1 locate.sh '.c' | wc -l 2 381666
分析脚本:
这个脚本还可以提升的地方就是参数检查。详情请见第43个脚本--执行安全的locate脚本。
注:现在有较新版本的locate命令考虑到了安全性的问题。这些选择都是作为最新的Red Hat Linux distribution的一部分,作为新的安全的locate包的一部分叫做slocate,可以从http://rpms.arvin.dk/slocate/下载。
ps:
这个脚本真没劲。就是统计系统中的文件数量,然后,第二个脚本用传个文件名参数查找下。不过,像我这样基本不使有root权限的人来说,可以把find查找的目录改为当前用户的家目录就可以了。这样就可以快速查找当前用户的文件了。
另外为了保持数据库文件的及时性,可以放在一个crontab中。