文件检索相关命令
一、概览
1. which:用于查找可执行文件(外部命令、脚本)
2. whereis:查找程序、帮助手册、源文件的位置
3. locate:索引库模糊查找
4. whatis:在whatis数据库里查找完整的单词,相当于man –f。
5. find:精确多条件查找
二、细说
实验环境如下显示,操作系统环境不同,命令执行后显示结果会略有出入,但是不影响命令的用法。
[[email protected] ~]$ uname–r //显示内核版本 2.6.18-348.el5 [[email protected] ~]$ 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变量:
[[email protected] ~]# 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变量:
[[email protected] ~]# su - user01 //临时切换登录为普通用户 [[email protected] ~]$ echo $PATH /usr/kerberos/bin:/usr/local/bin:/bin:/usr/bin:/home/user01/bin
使用which查找which命令的执行程序位置:
[[email protected] ~]# 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:
[[email protected] ~]# which -a touch //确保不会出现在下面用的/usr/bin目录 /bin/touch [[email protected] ~]# cp /bin/touch/usr/bin/ //复制touch到另一个执行目录(必须在$PATH里) [[email protected] ~]# 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 [[email protected] ~]# which touch //只查到第一个目标 /bin/touch [[email protected] ~]# which -a touch //查找所有目标 /bin/touch /usr/bin/touch
由于内部命令是内建在/bin/bash解释器中的指令,并没有独立的可执行文件存在,所以尝试用which来搜索是找不到的。例如,用which找cd、help等内部命令时会提示找不到结果:
[[email protected] ~]# 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的档案
[[email protected] ~]# whereis ifconfig ifconfig: /sbin/ifconfig/usr/share/man/man8/ifconfig.8.gz [[email protected] ~]# which ifconfig //root用户可以用which搜到 /sbin/ifconfig [[email protected] ~]# su - user01 //切换到普通用户user01的身份 [[email protected] ~]$ whereis ifconfig //普通用户与root找到的结果一样 ifconfig: /sbin/ifconfig/usr/share/man/man8/ifconfig.8.gz [[email protected] ~]$ 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并没有加入/sbin,which只是基于PATH里目录的搜寻
3. locate
语法:locate [选项] 关键字
选项与参数:
-i:忽略大小写
-d:指定使用的数据库
功能说明:搜索数据库而不是硬盘,所以搜索速度较快,默认的数据库/var/lib/mlocate/mlocate.db。有的系统默认每天更新一次数据库,也可以直接输入updatedb手动更新数据库。
删除/新增加的文件,需要更新数据库以后才能体现效果:
[[email protected] ~]# touch newfile //在当前目录下新建文件newfile [[email protected] ~]# locate newfile //找不到新增加的文件 [[email protected] ~]# updatedb //更新数据库 [[email protected] ~]# locate newfile //新增加的文件可以找到 /root/newfile
4.whatis
语法:whatis 关键字
功能说明:功能相当于man –f,对关键字的不同形式进行简短的描述。 查找的内容必须完全匹配关键字的才会输出。 whatis 数据库文件是用/usr/sbin/makewhatis 命令建立的。
用whatis查找passwd
[[email protected] ~]# 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手册页的入口
右边部分是对这个指令或文档的简短说明。
中间数字的用法:
[[email protected] ~]# man 1 passwd //这里是用man(1)的文件数据来显示passwd的帮助信息 [[email protected] ~]# man 5 passwd //这里是用man(5)的文件数据来显示passwd的帮助信息
5.find
语法:find [路径] [条件]
功能说明:find指令用于查找符合条件的文件。[-H][-L][-P]除外的任何位于参数之前的字符串都将被视为欲查找的目录。参数超级多
1)使用-type按类型查找
这里的类型指的是普通文件(f)、目录(d)、块设备文件(b)、字符设备文件(c)、链接(l)等。块设备指的是成块读取数据的设备(如硬盘、内存等),而字符设备指的是按单个字符读取数据的设备(如键盘、鼠标等)。
查找/boot目录下的符号连接文件:
[[email protected] ~]# find /boot -type l /boot/grub/menu.lst [[email protected] ~]# ls -lh /boot/grub/menu.lst lrwxrwxrwx 1 root root 11 2013-07-10/boot/grub/menu.lst -> ./grub.conf
查找/boot目录下的文件夹
[[email protected] ~]# find /boot -type d /boot /boot/grub /boot/lost+found
2)使用-name按名称查找
查找/boot目录下名称包含”grub”的对象
[[email protected] ~]# find /boot -name *grub* /boot/grub /boot/grub/grub.conf
3)组合多个条件查找
可使用-a同时匹配多个条件(都必须满足),-a可省略,例如可只列出/boot目录下名称包含”grub”的目录:
[[email protected] ~]# find /boot -name *grub* -a-type d /boot/grub
可使用-o同时匹配多个条件(只需满足其中任何一个),-o不可省略。例如查找/boot目录下名称包含”grub”或者是目录的对象。
[[email protected] ~]# find /boot -name *grub* -o-type d /boot /boot/grub /boot/grub/grub.conf /boot/lost+found
4)使用-size按大小查找,可指定容量单位c(小写,表示byte)k(小写)、M(大写)、G(大写)
通过“-size +大小”指定是否超过指定的容量。例如在/boot目录下查找容量超过2MB的文件:
[[email protected] ~]# find /boot -size +2M /boot/initrd-2.6.18-348.el5.img /boot/vmlinuz-2.6.18-348.el5
通过“-size -大小”指定是否小于指定的容量,例如在/boot/grub目录下查找容量小于2KB的普通文件:
[[email protected] ~]# 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天本身)被更改过的文件名
将过去系统上面24小时内有更动过的内容的文件列出
[[email protected] ~]# find / -mtime 0 //0代表目前的时间
6)使用 -exec 指定可执行语句对查找结果进行处理
在处理语句中,以 {} 代替查找结果、最后以 \; 表示处理结束(注意与前面的执行语句之间隔一个空格)。例如,上述find查找/boot目录下大于2MB文件操作,可直接用 -exec接上ls命令来列出详细属性:
[[email protected] ~]# 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的文件夹:
[[email protected] ~]# 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 搜寻指令的完整文件名可用which或type,这两个指令都是透过PATH变量来搜寻文件名;
2 搜寻文档的完整路径可以使用whereis或locate到数据库档案去搜寻,而不实际搜寻文件系统;
2 利用find可以加入许多选项来直接查询文件系统,以获得自己想要知道的文档。
2 要查找指令在man手册页的入口,可以用whatis或者man –f 。