第二章:Improving On User Commands--19.通过文件名定位文件

本文介绍了一个在Linux系统上用于快速查找文件的命令——locate。文章详细解释了如何通过两个脚本来实现文件查找功能,包括如何创建文件索引数据库及如何通过数据库查找特定文件。

   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中。

转载于:https://www.cnblogs.com/lalala23456/archive/2012/12/21/2828309.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值