文件检索相关命令

一、概览

    1. which:用于查找可执行文件(外部命令、脚本)

    2. whereis:查找程序、帮助手册、源文件的位置

    3. locate:索引库模糊查找

    4. whatis:在whatis数据库里查找完整的单词,相当于man –f

    5. find:精确多条件查找

二、细说

       实验环境如下显示,操作系统环境不同,命令执行后显示结果会略有出入,但是不影响命令的用法。

[user01@JDoer ~]$ uname–r                  //显示内核版本
2.6.18-348.el5
[user01@JDoer ~]$ cat/etc/redhat-release    //操作系统描述
Red Hat Enterprise Linux Server release 5.9(Tikanga)

        

1. which

语法:which [-a] 命令

选项或参数:

-a:将所有PATH目录中可以找到的指令均列出,而不止第一个被找到的指令名称。

功能说明: which可搜索的范围由环境变量PATH决定,通常情况下,管理员与普通用户的PATH变量是不同的,可分别以root用户、普通用户 user登入后执行echo $PATH 查看。

    root用户的PATH变量:

[root@JDoer ~]# echo $PATH
/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/X11R6/bin:/root/bin

    普通用户的PATH变量:

[root@JDoer ~]# su - user01                            //临时切换登录为普通用户
[user01@JDoer ~]$ echo $PATH                                 
/usr/kerberos/bin:/usr/local/bin:/bin:/usr/bin:/home/user01/bin

    使用which查找which命令的执行程序位置:

[root@JDoer ~]# which which
alias which='alias | /usr/bin/which --tty-only --read-alias--show-dot --show-tilde'//别名
       /usr/bin/which                                 //which命令的执行程序位置


从上述结果可以看到,which的输出结果包括了命令别名。这是因为Linux为了方便用户使用,设置了which别名以添加别名搜索所致。

which默认只输出找到的第一个目标,若要列出所有目标,应添加选项 -a:

[root@JDoer ~]# which -a touch                       //确保不会出现在下面用的/usr/bin目录
/bin/touch
[root@JDoer ~]# cp /bin/touch/usr/bin/    //复制touch到另一个执行目录(必须在$PATH里)
[root@JDoer ~]# ls -lh /bin/touch/usr/bin/touch     //确认复制结果
-rwxr-xr-x 1 root root 42K 2012-03-14/bin/touch
-rwxr-xr-x 1 root root 42K 08-02 10:59/usr/bin/touch
[root@JDoer ~]# which touch                         //只查到第一个目标
/bin/touch                                                                                  
[root@JDoer ~]# which -a touch                      //查找所有目标
/bin/touch
/usr/bin/touch

由于内部命令是内建在/bin/bash解释器中的指令,并没有独立的可执行文件存在,所以尝试用which来搜索是找不到的。例如,用which找cd、help等内部命令时会提示找不到结果:

[root@JDoer ~]# which cd help
/usr/bin/which: no cd in(/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:
/sbin:/bin:/usr/sbin:/usr/bin:/usr/X11R6/bin:/root/bin)
/usr/bin/which: no help in(/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:
/sbin:/bin:/usr/sbin:/usr/bin:/usr/X11R6/bin:/root/bin)

        

    2.whereis

语法:whereis [-bmsu] 命令或目录

选项与参数:

-b :只找binary格式的文件

-m :只找在说明文件manual路径下的档案

-s  :只找source来源档案

-u  :搜寻不再上述三个项目当中的其他特殊档案

功能说明:Linux系统会将系统内的所有档案都记录在一个数据库里,而当使用whereis或者是locate时,都会以此数据库档案的内容为准,因此,有的时候你会发现使用这两个命令时,会找到已经被删除的文件,而且也找不到最新的刚刚建立的文件,这时只需更新数据库,然后再用这两个命令搜寻。

使用不同的身份找出ifconfig的档案

[root@JDoer ~]# whereis ifconfig
ifconfig: /sbin/ifconfig/usr/share/man/man8/ifconfig.8.gz
[root@JDoer ~]# which ifconfig                               //root用户可以用which搜到
/sbin/ifconfig
[root@JDoer ~]# su - user01                                 //切换到普通用户user01的身份
[user01@JDoer ~]$ whereis ifconfig                          //普通用户与root找到的结果一样
ifconfig: /sbin/ifconfig/usr/share/man/man8/ifconfig.8.gz
[user01@JDoer ~]$ which ifconfig                            //但是普通用户用which却找不到
/usr/bin/which: no ifconfig in(/usr/kerberos/bin:/usr/local/bin:/bin:/usr/bin:/home/user01/bin)

    which一般使用找不到的ifconfig却可以让whereis找到,这是因为系统真的有ifconfig这个档案,但是使用者的PATH并没有加入/sbinwhich只是基于PATH里目录的搜寻

        

3. locate

语法:locate [选项] 关键字

选项与参数:

-i:忽略大小写

-d:指定使用的数据库

功能说明:搜索数据库而不是硬盘,所以搜索速度较快,默认的数据库/var/lib/mlocate/mlocate.db。有的系统默认每天更新一次数据库,也可以直接输入updatedb手动更新数据库。

删除/新增加的文件,需要更新数据库以后才能体现效果:

[root@JDoer ~]# touch newfile                 //在当前目录下新建文件newfile
[root@JDoer ~]# locate newfile                //找不到新增加的文件
[root@JDoer ~]# updatedb                      //更新数据库
[root@JDoer ~]# locate newfile                //新增加的文件可以找到
/root/newfile

        

    4.whatis

    语法:whatis 关键字

    功能说明:功能相当于man –f,对关键字的不同形式进行简短的描述。 查找的内容必须完全匹配关键字的才会输出。 whatis 数据库文件是用/usr/sbin/makewhatis 命令建立的。

    whatis查找passwd

[root@JDoer ~]# whatis passwd
passwd               (1)  - update user's authentication tokens
passwd               (5)  - password file
passwd              (rpm) - The passwd utility forsetting/changing passwords using PAM
passwd [sslpasswd]   (1ssl) - compute password hashes

左边部分是指令或文档及该指令所代表的意义

中间的数字或是“rpm”等表示该指令所代表的意义,数字是man手册页的入口

右边部分是对这个指令或文档的简短说明。

中间数字的用法:

[root@JDoer ~]# man 1 passwd   //这里是用man(1)的文件数据来显示passwd的帮助信息
[root@JDoer ~]# man 5 passwd   //这里是用man(5)的文件数据来显示passwd的帮助信息


        

   5.find

   语法:find [路径] [条件]

   功能说明:find指令用于查找符合条件的文件。[-H][-L][-P]除外的任何位于参数之前的字符串都将被视为欲查找的目录。参数超级多

   1)使用-type按类型查找

   这里的类型指的是普通文件(f)、目录(d)、块设备文件(b)、字符设备文件(c)、链接(l)等。块设备指的是成块读取数据的设备(如硬盘、内存等),而字符设备指的是按单个字符读取数据的设备(如键盘、鼠标等)。

查找/boot目录下的符号连接文件:

[root@JDoer ~]# find /boot -type l
/boot/grub/menu.lst
[root@JDoer ~]# ls -lh /boot/grub/menu.lst
lrwxrwxrwx 1 root root 11 2013-07-10/boot/grub/menu.lst -> ./grub.conf

    查找/boot目录下的文件夹

[root@JDoer ~]# find /boot -type d
/boot
/boot/grub
/boot/lost+found

   2)使用-name按名称查找

   查找/boot目录下名称包含”grub”的对象

[root@JDoer ~]# find /boot -name *grub*
/boot/grub
/boot/grub/grub.conf

   3)组合多个条件查找

   可使用-a同时匹配多个条件(都必须满足),-a可省略,例如可只列出/boot目录下名称包含”grub”的目录:

[root@JDoer ~]# find /boot -name *grub* -a-type d
/boot/grub

   可使用-o同时匹配多个条件(只需满足其中任何一个),-o不可省略。例如查找/boot目录下名称包含”grub”或者是目录的对象。

[root@JDoer ~]# find /boot -name *grub* -o-type d
/boot
/boot/grub
/boot/grub/grub.conf
/boot/lost+found

    4)使用-size按大小查找,可指定容量单位c(小写,表示bytek(小写)、M(大写)、G(大写)

通过“-size +大小”指定是否超过指定的容量。例如在/boot目录下查找容量超过2MB的文件:

[root@JDoer ~]# find /boot -size +2M
/boot/initrd-2.6.18-348.el5.img
/boot/vmlinuz-2.6.18-348.el5

通过“-size -大小”指定是否小于指定的容量,例如在/boot/grub目录下查找容量小于2KB的普通文件:

[root@JDoer ~]# find /boot -size -2k
/boot
/boot/grub
/boot/grub/stage1
/boot/grub/device.map
/boot/grub/menu.lst
/boot/grub/grub.conf
/boot/.vmlinuz-2.6.18-348.el5.hmac

   5)使用-mtime按是否在指定日期内修改过进行查找

   -mtimen

          n   n为数字,意义在n天之前的一天之内被更改过的文件

          +n  列出在n天之前(不含n天本身)被更改过的文件名

          -n  列出在n天之内(含n天本身)被更改过的文件名

  

​文件检索相关命令总结_find

    将过去系统上面24小时内有更动过的内容的文件列出

[root@JDoer ~]# find / -mtime 0              //0代表目前的时间

6使用 -exec 指定可执行语句对查找结果进行处理

在处理语句中,以 {} 代替查找结果、最后以 \; 表示处理结束(注意与前面的执行语句之间隔一个空格)。例如,上述find查找/boot目录下大于2MB文件操作,可直接用 -exec接上ls命令来列出详细属性:

[root@JDoer ~]# find /boot -size +2M -execls -lh {} \;
-rw------- 1 root root 2.7M 2013-07-23/boot/initrd-2.6.18-348.el5.img
-rw-r--r-- 1 root root 2.1M 2012-11-29/boot/vmlinuz-2.6.18-348.el5

   7)使用-user-group查找属于指定用户、组的文档

   在根目录下查找属于用户user01的文件夹:

[root@JDoer ~]# find / -user user01 -type d
/home/user01
/home/user01/.mozilla
/home/user01/.mozilla/extensions
/home/user01/.mozilla/plugins

   8)使用-perm查找指定权限的文档(具体可参见man手册)

    find . -perm 600      //当前目录只要有文档的属主的权限包含读写,都打印出来
    find . -perm u+rw     //和find . -perm 600结果一样
    find . -perm u=rw     //和find . -perm 600结果一样
    find . -perm +600     //只要当前目录下文档属主的权限有读或写,都打印出来    
    find . -perm -600     //只要当前目录下文档属主的权限有读且写,都打印出来


三、总结

2       搜寻指令的完整文件名可用whichtype,这两个指令都是透过PATH变量来搜寻文件名;

2       搜寻文档的完整路径可以使用whereislocate到数据库档案去搜寻,而不实际搜寻文件系统;

2       利用find可以加入许多选项来直接查询文件系统,以获得自己想要知道的文档。

2       要查找指令在man手册页的入口,可以用whatis或者man –f