五、Linux常用命令之文件搜索篇(which、whereis、find、locate、grep、man、info、whatis、--help、apropos、help)

时间:2022-03-07 09:18:20

转载请注明出处:http://blog.csdn.net/yiliumu/article/details/20579551

文件搜索命令:

在操作一个系统的时候,我们不可避免的要进行一些搜索的操作,
1、which:显示系统命令所在目录,直接定位到这个命令的绝对路径,还有命令的别名
(之前文章说过,Linux下所有的东西都是文件,包括命令也是一个文件,一个文件存放目录的不同,就决定了这个命令哪些用户可以使用它,哪些不可以。粗略的来分:一种命令是只有管理员可以用,一种命令是普通用户可以用,要想进行更复杂的权限设置,只要用上节课的chmod来设置就可以了)
所以我们用which命令来查这个命令所在的目录的时候,如果它显示的是在/bin/目录下,或者是/usr/bin/目录下,那么这个命令就是所有人都可以用,如果是在/sbin/目录底下,那么就证明它只能是管理员可以用
which缺点:只能查看命令文件,不能查看其他文件
which ls 
结果:alias ls='ls --color=auto'
        /bin/ls

2、whereis,显示命令所在的目录及该命令帮助文档的路径
whereis ls
结果:ls: /bin/ls /usr/share/man/man1/ls.1.gz /usr/share/man/man1p/ls.1p.gz(命令帮助文档路径)
总结:which在查看命令所在的目录的同时,还可以看到这个命令的”别名记录“。
而whereis在查看命令所在的目录的同时,还可以看到这个命令的帮助文档所在的位置,我们是调用帮助文档来查看帮助的内容,那这个命令的帮助文档在哪里,这个时候就可以使用whereis来查看了

以上两个命令只能是来查找“命令文件”,那如果我们要查看一些配置文件等等,那我们可以使用:
3、find
find是一个通用的查找文件的命令,它可以用来查找所有的文件(图片,网页,压缩包,配置文件,命令文件,硬件文件等)所在路径:/usr/bin/find
语法:find [搜索路径] [搜寻关键字]
使用find查找技巧:避免在整个硬盘查找“/”根目录,因为它会占用庞大的系统资源,搜索范围越小越好
find非常复杂,下面是find最常用的一些用法:
*find /etc -name init  在根目录/etc中查找文件init 
*find / -size +204800     在根目录下查找大于100MB的文件
*find /home -user samlee 在根目录下查找所有者为samlee的文件
其中-name,-size,-user都是我们要搜寻的关键字,即根据什么来查找,名字,大小,所有者,-type,文件类型,d目录,l软连接,f二进制文件

尝试:find /etc -name init,结果如下:
/etc/kdump-adv-conf/kdump_initscripts/init
/etc/init
/etc/sysconfig/init
在Linux中,根据搜索的名字来查找,那么它就会列出文件名为init的文件,包含这个init的文件并不会被列出来,不像windows下,会将搜索与init这个关键字相关的文件都列出来,比如tabinit等等,如果想要将包含有init的文件名都列出来,那么就要使用通配符了:
(1)通配符:“*”匹配任意字符(包括0个字符)  ?匹配单个字符
init*表示与init开头的所有文件
init???表示被查找的文件是7个字符的,后面三位为任意

(2)find / -size +204800      +大于       -小于       =等于
-size,根据文件大小查找,这个大小的单位是“块”,在Linux中,我们采用存储文件的最小单位是数据块block,数据块的大小为512字节=0.5KB(这个数据块的大小是可以设置的)  相当于1KB等于2block,此处我们也可以加上单位:比如:+1234k,
比如我们要查找一个文件为100MB的,就必须将100MB换算成数据块单位
100MB=102400KB=204800block

(3)-type   根据文件类型查找
f为二进制文件,l为软链接,d为目录

(4)find /home -user samlee   根据文件的所有者查找

(5)根据“时间”来查找,比如我们在一台服务器上,被黑客攻击了,我们要查找在这两个小时内被黑客修改的文件,这时候我们就可以使用时间来查找了。
1、天:-ctime(改变,修改change)   、-atime(access访问)、-mtime(modify修改时间),以天为单位,是24小时,所以是time
2、分钟:-cmin、-amin、-mmin。在应用过程中,如果我们要查找2小时内被修改的文件,就可以使用120分钟就可以了
c-chang:改变,修改,表示文件属性被修改过,比如:该文件的所有者,所属组,权限,其实就是ls时候的内容
a-access:访问
m-modify:修改,表示文件的内容被修改过
还有两个选项
+表示超过这个时间,-表示在这个时间之内,没有=,比如
例子:find /etc -mmin -120  表示2个小时之内被修改过的文件

(6)还有的时候,我们要查看一下大小范围的文件,比如在大于多少,小于多少
有两个连接符:(连接符:用来连接不同语句的)
-a  and 表示逻辑与           -o or 表示逻辑或
find /etc -size +163840 -a -size -204800  表示查找大于80MB小于100MB的文件,注意大小前面都有一个-size
比如:有时候我们在查找的时候,我们就要查找出一个二进制文件,那么我们就可以在关键字后面加上一个-a -type f
举例:find /etc -name init* -a -type f    此时就会将与init开头的二进制文件列出来了,目录和软链接就不会显示出来
注意:也就是说,根据什么来查找就一定要是成对出现的,比如:-name init*.......-type l......-size +204800    find /etc -name init* -a -type l,尽管后面是用-a链接的多查询条件

(7)与find结合使用的两个选项:-exec和-ok,都是对find结果进行二次操作:
-exec,固定格式用法:     (-exec后面只能是跟原来的命令,不能跟命令的别名,因为后面有转义符\,会将命令转义,别名转义后就不知道什么命令了)
格式:find...-exec 命令 {} \;表示查找这条命令,再执行它
其中{}表示前面find查询出来的所有结果
\表示转义符,说白了就是让一些符号或者命令使用它本身的含义,比如我们在删除一个文件的时候,系统会提示我们是否确认删除,其实rm命令本身是没有这个提示的,我们可以使用which rm查看,发现rm有一个别名,是它的别名中包含了提示,那么我们此时可以使用转义符\rm,将rm使用它原来的含义去使用,这个时候发现系统就没有提示我们确认了。还有就是我们在使用ls查看文件目录的时候,会发现有一些颜色标识,我们也可以使用\ls来转义,这时候就没有了颜色标识了;
例子:比如我们可以查看一个文件
find /etc -name inittab此时就会帮我们列出这个文件,但是我们想查看它的详细信息的时候
find /etc -name inittab -exec ls -l {} \;      注意:\和;之间不能有空格,否则会被以为遗漏了参数“;”    后面的“\”是对前面命令ls的转义
-rw-r--r--. 1 root root 884  5鏈?21 04:45 /etc/inittab

find /prem -name newfile3 -exec rm {} \;查找出文件名为newfile3的,并将其删除

还有一个与-exec非常相似的连接符,-ok,表示系统会进行“询问确认”
比如:find /etc -name inittab -ok ls -l {} \;此时系统就会有一个询问确认的过程:< ls ... /etc/inittab > ? ,那如果我们不是使用ls -l {} \,而是使用rm {} \,这个时候-ok就非常有价值了,那为什么-exec不会询问呢,因为我们这在后面加上了rm {} \;‘\’就表示转义的意思,rm原来是没有询问机制的,是因为有了别名,才有询问,所以使用-exec rm {} \;就不会询问的
find -name inittab -ok rm {} \ ;

其实find可以写得很复杂:find /etc -name init* -a -type f -exec ls -l {} \;

(8)根据i节点来查找,有的时候,我们会发现,有些人在目录下会创建一些奇怪的文件名,如果ab,-ab等等的文件,这个时候如果我们只是使用rm这个命令,是删除不掉他们的,系统会认为你是要删除a 和b两个文件,或者把-ab看做是一个选项来操作了
创建a b:touch /prem/"a b"
创建-ab:cd /prem   touch -- -ab

我们在知道这些文件是怎么创建的前提下,就可以使用相应的一些转义符来删除他们,比如
rm --- -ab            rm "a b"
但是很多情况下,我们不知道其他用户是怎么创建这些文件的,那么我们有一个非常牛逼的方法:使用inode来删除他们,我们之前说过,每个文件不管他们的文件名多奇怪,他们都有自己的inode,进入该文件所在的目录,使用ls -i,查看所有文件的inode,然后此时在当前目录下,我们可以使用-inum这个选项来根据i节点查找文件
find -inum 16          注意:这是在当前目录下查找,可以不用写搜索路劲
find -inum 10869 -exec rm {} \; 使用inum查找到这个奇怪的文件之后,将其删除,注意:这是在该文件所在的目录下执行的命令,如果是在其他目录下,则需要find 目录,需要指定到该文件的目录下
如:find /prem -inum 10869 -exec rm {} \;

(9)搜索一个目录:find /usr -name local -a -type d

4、文件搜索命令:locate
locate一般在Unix中不提供使用,在Linux提供使用,比如你在公司中使用 solaris系统,那就没有这个命令了,用IBM的AIX也没有,但是Linux基本都有这个命令,也是用来查找文件和目录的
locate 文件名,比如locate newfile2
我们发现这个速度比find要快很多,是的,但是使用locate在查找的时候,有些文件是找不到的,为什么。道理很简单,find是根据整个硬盘来回查找一遍的,而locate是根据你定期更新的系统数据库来查找的,所以他速度非常快
所以locate需要配合一个命令来使用,updatedb,表示更新系统数据库,(系统都有一个定期执行更新数据库的计划)因为有时候我们在创建一个文件的时候,这个文件没有及时被录入到系统数据库中,而locate查找的时候是在系统数据库中查找的,所以就会出现找不到这个文件的。这时候我们可以手动的更新数据库文件,直接在命令行中敲入updatedb即可,更新完数据库之后,再查找,就可以找到了:
updatedb
locate newfile2
如果你想快速定位到某个文件,或者你喜欢用它,那就使用updatedb来更新一下数据库,再locate来查找这个文件locate newfile2
注意,Unix下locate是不存在的,而find是所有系统都存在的,使用locate不需要指定搜索路径,只需要更新数据库,updatedb,然后使用locate+文件或目录名,就可以搜索到相关文件,而且他会自动匹配,只要写newfile,就会查找出所有包含newfile这个字符串的文件或者目录名

5、文件搜索命令grep
功能:在”文件内容“搜索字符串匹配的行,并输出
语法:grep [指定字符串] [源文件]
例子:grep ftp /etc/services
比如我们在services文件中,想找到ftp相关的行,那么就可以使用grep查找,并将其输出

以上是搜索命令

6、帮助命令:man
功能:获得帮助信息
原意:manual
所在路径:/usr/bin/man
权限:所有用户
语法:man [命令或配置文件] 
例子:man ls 表示查看ls命令的帮助信息
man services 表示查看services配置文件的帮助信息,注意:直接写配置文件的名称即可,不需要写目录:man /etc/services这样反而错了

还有一点要注意:命令和配置文件同名
我们在查看passwd命令的帮助的时候,在etc/目录下有一个名叫passwd的配置文件,那他会怎样去查找呢,系统会优先查找命令的帮助
 man passwd,我们看到的并不是配置文件的帮助,那我们如果看到passwd配置文件帮助呢,这时候我们可以先通过man来查看man命令的帮助,发现命令在man命令里序号是1,配置文件序号为5,也就是说我们此时要查看的是配置文件的帮助,那么我们就可以使用:
man 5 passwd此时就会是配置文件的帮助信息了,系统默认就是查看命令的帮助,所以默认是1,1可以不写

7、还有一个和man十分类似的:info,只是显示的格式有所不一样
语法:info [任何关键字]
功能:获取命令和配置文件的帮助信息
例子:info ls 
但是在Unix下是没有这个命令的,Linux大多数有这个命令

8、获取简短的帮助信息:
但是,有时候我们并不想看到帮助文件的那么多信息,我们只想知道这个命令式干什么用的,而不用知道他的用法,那么这时候我们可以使用whatis,来查看帮助文档中的name值
whatis whereis
表示查看whereis的用途

9、那如果我们只想查看这个命令的主要“选项”,那么我们可以在命令的后面加上--help(两斜杠)
ls - -help
此时就会将ls的所有选项列出来了

10、命令apropos和whatis是在索引数据库中查看的,比如有时候你安装了新的软件,那这个索引数据库就要更新这个新的软件的命令,所以我们在使用whatis和apropos的时候,就要时常更新我们的索引数据库,使用makewhatis,建立whatis和apropos搜索使用的数据库,当使用这两个命令发上错误时(即没有得到新的软件命令的信息),就是whatis database没有建立

11、在之前我们讲过Linux系统结构的时候,提到说:最底层是硬件,再上一层是内核,再上一层就是shell了,表示命令行的交互方式,shell实际上也是一个软件,shell有很多种(shell,称作命令解释器,用来实现用户和内核之间的交互,当用户在shell提示符下输入命令时,这些都是ascii值,此时就要通过命令解释器shell来讲ascii值转换为机器码,内核才能识别出来,内核做出相应,将数据回应回去,shell再次将机器码转为ascii码,返回给用户。不同的Linux发行版本和不同的Unix发行版本的最根本区别就是shell命令解释器的不同),同时每一种内置的命令有所不同,就是有些shell内置命令不隶属于任何目录,是安装shell时自带的,这些命令在获得帮助信息的时候有所区别,比如
我们可以使用man cd,来查看帮助信息,一堆,其实是在告诉你当前这个shell有哪些内置命令,:
NAME
       bash,  :,  .,  [, alias, bg, bind, break, builtin, caller, cd, command,
       compgen, complete, compopt,  continue,  declare,  dirs,  disown,  echo,
       enable,  eval,  exec, exit, export, false, fc, fg, getopts, hash, help,
       history, jobs, kill, let, local, logout, mapfile, popd, printf,  pushd,
       pwd,  read, readonly, return, set, shift, shopt, source, suspend, test,
       times, trap, true, type, typeset, ulimit, umask, unalias, unset, wait -
       bash built-in commands, see bash(1)
上面这些都是当前shell的内置命令,也就是说我们要查看的cd是shell内置命令,所以使用man查看时并不是我们想要的cd的帮助文档
(也可以使用type来判断是不是shell命令,比如:type cd,就会提示cd is a shell builtin,是一个shell命令)
此时我们可以使用:
12、help:
查看shell“内置命令”的帮助,要想查shell内置命令的帮助,使用man和info是没有办法获得的。
cd /进入根目录
help cd:显示内容为:
cd: cd [-L|-P] [dir]
    Change the shell working directory.
    
    Change the current directory to DIR.  The default DIR is the value of the
    HOME shell variable.

这就是我们要查的cd帮助文档,所以,有时候我们在使用man查看不到帮助文档的时候,有可能这个命令是shell帮助文档的命令,此时我们看下是否在里面(man出错时,在name里的就是shell内置命令),然后在使用help 命令来查看

本章节学习了Linux文件搜索相关命令,下一章节将学习Linux压缩打包命令。