当前位置: 首页 » unix(重复的事情交给我吧) » basic_description » Linux查找命令和文本–which,find,locate,whereis

Linux查找命令和文本–which,find,locate,whereis

[文章目录] x

文件的搜寻可就厉害了!因为我们常常需要知道那个文件放在哪里,才能够对该文件进行一些修改或维护等动作。有些时候某些软件配置文件的文件名是不变的,但是各 distribution 放置的目录则不同。此时就得要利用一些搜寻指令将该配置文件的完整档名捉出来,这样才能修改嘛!

一、脚本文件名的搜寻:

我们知道在终端机模式当中,连续输入两次[tab]按键就能够知道用户有多少指令可以下达。 那你知不知道这些指令的完整文件名放在哪里?举例来说,ls 这个常用的指令放在哪里呢? 就透过 which 或 type 来找寻吧!

which (寻找『执行文件』)

范例一:分别用root与一般账号搜寻 ifconfig 这个指令的完整文件名

范例二:用 which 去找出 which 的档名为何?

[root@www ~]# which which
alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot '
/usr/bin/which

# 竟然会有两个 which ,其中一个是 alias 这玩意儿呢!那是啥?
# 那就是所谓的『命令别名』,意思是输入which 会等于后面接的那串指令啦!
# 更多的数据我们会在 bash 章节中再来谈的!

范例三:请找出 cd 这个指令的完整文件名

这个指令是根据『PATH』这个环境变量所规范的路径,去搜寻『执行文件』的档名~ 所以,重点是找出『执行文件』而已!且which 后面接的是『完整文件名』喔!若加上 -a 选项,则可以列出所有的可以找到的同名执行文件,而非仅显示第一个而已!

最后一个范例最有趣,怎么 cd 这个常用的指令竟然找不到啊!为什么呢?这是因为 cd 是『bash 内置的指令』啦! 但是 which 预设是找 PATH 内所规范的目录,所以当然一定找不到的啊!那怎办?没关系!我们可以透过 type 这个指令喔!

二.文件名的搜寻:

在 Linux 底下也有相当优异的搜寻指令呦!通常 find 不很常用的!因为速度慢之外。通常我们都是先使用 whereis 或者是 locate 来检查,如果真的找不到了,才以 find 来搜寻呦! 为什么呢?因为 whereis 与 locate 是利用数据库来搜寻数据,所以相当的快速,而且并没有实际的搜寻硬盘, 比较省时间啦!

whereis (寻找特定文件)

范例一:请用不同的身份找出 ifconfig 这个档名

# 注意看,明明 which 一般使用者找不到的ifconfig 却可以让 whereis 找到!
# 这是因为系统真的有 ifconfig 这个『文件』,但是使用者的PATH 并没有加入 /sbin
所以,未来你找不到某些指令时,先用文件搜寻指令找找看再说!

范例二:只找出跟 passwd 有关的『说明文件』档名(man page)

等一下我们会提到 find 这个搜寻指令, find 是很强大的搜寻指令,但时间花用的很大! (因为 find 是直接搜寻硬盘,为如果你的硬盘比较老旧的话,嘿嘿!有的等!) 这个时候 whereis 就相当的好用了!另外, whereis 可以加入选项来找寻相关的数据, 例如如果你是要找可执行文件( binary )那么加上 -b 就可以啦! 如果不加任何选项的话,那么就将所有的数据列出来啰!

那么 whereis 到底是使用什么咚咚呢?为何搜寻的速度会比 find 快这么多? 其实那也没有什么!这是因为 Linux 系统会将系统内的所有文件都记录在一个数据库文件里面, 而当使用 whereis 或者是底下要说的locate 时,都会以此数据库文件的内容为准, 因此,有的时后你还会发现使用这两个执行档时,会找到已经被杀掉的文件! 而且也找不到最新的刚刚建立的文件呢!这就是因为这两个指令是由数据库当中的结果去搜寻文件的所在啊! 更多与这个数据库有关的说明,请参考下列的 locate 指令。

locate

范例一:找出系统中所有与 passwd 相关的档名

这个 locate 的使用更简单,直接在后面输入『文件的部分名称』后,就能够得到结果。 举上面的例子来说,我输入 locate passwd ,那么在完整文件名 (包含路径名称) 当中,只要有 passwd 在其中, 就会被显示出来的!这也是个很方便好用的指令,如果你忘记某个文件的完整档名时~~

但是,这个东西还是有使用上的限制呦!为什么呢?你会发现使用 locate 来寻找数据的时候特别的快, 这是因为 locate 寻找的数据是由『已建立的数据库 /var/lib/mlocate/』 里面的数据所搜寻到的,所以不用直接在去硬盘当中存取数据,呵呵!当然是很快速啰!

那么有什么限制呢?就是因为他是经由数据库来搜寻的,而数据库的建立默认是在每天执行一次 (每个 distribution 都不同,CentOS 5.x 是每天更新数据库一次!),所以当你新建立起来的文件, 却还在数据库更新之前搜寻该文件,那么 locate 会告诉你『找不到!』呵呵!因为必须要更新数据库呀!

那能否手动更新数据库哪?当然可以啊!更新 locate 数据库的方法非常简单,直接输入『 updatedb 』就可以了! updatedb 指令会去读取/etc/updatedb.conf 这个配置文件的设定,然后再去硬盘里面进行搜寻文件名的动作, 最后就更新整个数据库文件啰!因为 updatedb 会去搜寻硬盘,所以当你执行 updatedb 时,可能会等待数分钟的时间喔!

updatedb:根据/etc/updatedb.conf 的设定去搜寻系统硬盘内的文件名,并更新 /var/lib/mlocate 内的数据库文件;
locate:依据 /var/lib/mlocate 内的数据库记载,找出用户输入的关键词文件名。

find

范例一:将过去系统上面 24 小时内有更动过内容 (mtime) 的文件列出

范例二:寻找 /etc 底下的文件,如果文件日期比 /etc/passwd 新就列出

时间参数真是挺有意思的!我们现在知道 atime, ctime 与 mtime 的意义,如果你想要找出一天内被更动过的文件名, 可以使用上述范例一的作法。但如果我想要找出『4天内被更动过的文件档名』呢?那可以使用『 find /var -mtime -4 』。那如果是『4天前的那一天』就用『 find /var -mtime 4 』。有没有加上『+, -』差别很大喔!我们可以用简单的图示来说明一下:

2. 与使用者或组名有关的参数:

范例三:搜寻 /home 底下属于 vbird 的文件

范例四:搜寻系统中不属于任何人的文件

如果你想要找出某个用户在系统底下建立了啥咚咚,使用上述的选项与参数,就能够找出来啦! 至于那个 -nouser 或 -nogroup 的选项功能中,除了你自行由网络上面下载文件时会发生之外, 如果你将系统里面某个账号删除了,但是该账号已经在系统内建立很多文件时,就可能会发生无主孤魂的文件存在! 此时你就得使用这个 -nouser 来找出该类型的文件啰!

3. 与文件权限及名称有关的参数:

范例五:找出档名为 passwd 这个文件

范例六:找出 /var 目录下,文件类型为 Socket 的檔名有哪些?

范例七:搜寻文件当中含有 SGID 或 SUID 或 SBIT 的属性

上述范例中比较有趣的就属 -perm 这个选项啦!他的重点在找出特殊权限的文件啰! 我们知道 SUID 与 SGID 都可以设定在二进制程序上,假设我想要找出来 /bin, /sbin 这两个目录下, 只要具有 SUID 或 SGID 就列出来该文件,你可以这样做:

因为 SUID 是 4 分,SGID 2 分,总共为 6 分,因此可用 +6000 来处理这个权限! 至于 find 后面可以接多个目录来进行搜寻!另外, find 本来就会搜寻次目录,这个特色也要特别注意喔! 最后,我们再来看一下 find 还有什么特殊功能吧!

4. 额外可进行的动作:

范例八:将上个范例找到的文件使用 ls -l 列出来~

范例九:找出系统中,大于 1MB 的文件

find 的特殊功能就是能够进行额外的动作(action)。我们将范例八的例子以图解来说明如下:

{} 代表的是『由 find 找到的内容』,如上图所示,find 的结果会被放置到 {} 位置中;
-exec 一直到 \; 是关键词,代表 find 额外动作的开始(-exec) 到结束 (\;) ,在这中间的就是 find 指令内的额外动作。 在本例中就是『 ls -l {} 』啰!
因为『 ; 』在 bash 环境下是有特殊意义的,因此利用反斜杠来跳脱。
透过图 5.2.2 你应该就比较容易了解 -exec 到 \; 之间的意义了吧!

如果你要找的文件是具有特殊属性的,例如 SUID 、文件拥有者、文件大小等等, 那么利用 locate 是没有办法达成你的搜寻的!此时 find 就显的很重要啦! 另外,find 还可以利用通配符来找寻档名呢!举例来说,你想要找出 /etc 底下檔名包含 httpd 的文件, 那么你就可以这样做:

不但可以指定搜寻的目录(连同次目录),并且可以利用额外的选项与参数来找到最正确的档名!真是好好用! 不过由于 find 在寻找数据的时后相当的操硬盘!所以没事情不要使用 find 啦!有更棒的指令可以取代呦!那就是上面提到的 whereis 与 locate 啰!

参考资料:
鸟哥私房菜 http://linux.vbird.org/linux_basic/0220filemanager.php#file_find


下一篇 :

上一篇 :

暂无评论

发表评论

电子邮件地址不会被公开。 必填项已用*标注

$(document).ready(function(){ $("#article-index").css('display','none');});