搜索相关命令: type,which,whereis,locate,find

作者:jicanmeng

时间:2016年06月06日


  1. type: bash shell的内建命令
  2. which: 搜索可执行文件
  3. whereis: 搜索可执行文件和manual文档
  4. locate: 和whereis差不多,但搜索的更多
  5. find: 在磁盘中进行搜索,速度最慢

1. type: bash shell的内建命令

命令格式如下:

type [-tpa] name

-t: 当加入 -t 参数时,type 会将 name 以底下这些字眼显示出他的意义:

-p: 如果后面接的 name 为外部指令时,才会显示完整档名;

-a: 将所有含 name 的指令都列出来,包含 alias

不加任何选项与参数时,type 会显示出 name 是外部指令还是 bash 内建指令。

示例如下:

[jicanmeng@andy tmp]$ type -t cd
                    builtin
                [jicanmeng@andy tmp]$ type -t ifconfig
                    file
                [jicanmeng@andy tmp]$ type -t ls
                    alias
                [jicanmeng@andy tmp]$ type cd
                    cd is a shell builtin
                [jicanmeng@andy tmp]$ type ifconfig
                    ifconfig is /sbin/ifconfig
                [jicanmeng@andy tmp]$ type ls
                    ls is aliased to `ls --color=auto'
                [jicanmeng@andy tmp]$ type -a ls
                    ls is aliased to `ls --color=auto'
                    ls is /bin/ls
                [jicanmeng@andy tmp]$

2. which: 搜索可执行文件

这个指令是根据‘PATH’这个环境变数所规范的路径,去搜寻‘执行档’的档名。命令格式如下:

which name

示例如下:

[jicanmeng@andy tmp]$ which ifconfig
                    /sbin/ifconfig
                [jicanmeng@andy tmp]$

3. whereis: 搜索可执行文件和manual文档

除了搜索二进制的可执行文件,还能搜索manual文档。命令格式如下:

whereis [-bm] name

示例如下:

[jicanmeng@andy tmp]$ whereis ifconfig
                    ifconfig: /sbin/ifconfig /usr/share/man/man8/ifconfig.8.gz
                [jicanmeng@andy tmp]$ whereis -b ifconfig
                    ifconfig: /sbin/ifconfig
                [jicanmeng@andy tmp]$ whereis -m ifconfig
                    ifconfig: /usr/share/man/man8/ifconfig.8.gz
                [jicanmeng@andy tmp]$

4. locate: 和whereis差不多,但搜索的更多

which,whereis命令在搜索的时候,指定的是完整的文件名。locate可以只指定部分文件名。命令格式如下:

locate [-ir] name

示例如下:

[jicanmeng@andy tmp]$ locate ifconfig
                    /sbin/ifconfig
                    /usr/sbin/pifconfig
                    /usr/share/man/de/man8/ifconfig.8.gz
                    /usr/share/man/fr/man8/ifconfig.8.gz
                    /usr/share/man/man8/ifconfig.8.gz
                    /usr/share/man/man8/pifconfig.8.gz
                    /usr/share/man/pt/man8/ifconfig.8.gz
                [jicanmeng@andy tmp]$

5. 在磁盘中进行搜索,速度最慢

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

虽然如此,我们也需要好好学习一下find的用法。因为它实在是太强大了。命令格式如下:

find [PATH] [option] [action]
  1. 与时间有关的选项: 共有 -atime, -ctime 与 -mtime。以 -mtime 说明:
    • -mtime n :n 为数字,意义为在 n 天之前的‘一天之内’被更动过内容的档案;
    • -mtime +n :列出在 n 天之前(不含 n 天本身)被更动过内容的档案档名;
    • -mtime -n :列出在 n 天之内(含 n 天本身)被更动过内容的档案档名。
    • -newer file :file 为一个存在的档案,列出比 file 还要新的档案档名

    示例如下:

    # 将更改内容还未超过24小时的文件列出:
                        [jicanmeng@andy tmp]$ find / -mtime 0
                            ...
                        # 将/etc目录下比/etc/passwd文件还要新的文件列出:
                        [jicanmeng@andy tmp]$ find /etc -newer /etc/passwd
                            ...
                        [jicanmeng@andy tmp]$

    第一个例子需要详细说一说。为什么指定为0呢? 我们先看一看man find对于这个参数是怎么说的:

    Numeric arguments can be specified as
    +n for greater than n,

    -n for less than n,

    n for exactly n.

    -atime n
    File was last accessed n*24 hours ago. When find figures out how many 24-hour periods ago the file was last accessed, any fractional part is ignored, so to match -atime +1, a file has to have been accessed at least two days ago.

    -mtime n
    File’s data was last modified n*24 hours ago. See the comments for -atime to understand how rounding affects the interpretation of file modification times.

    可以看出来,计算时间其实就是计算从最后一次修改到现在经过的小时数除以24,对于商取整数。如果修改文件还未超过24小时,商自然就为0了。其实-mtime后面指定的参数就是商的大小了。-mtime +4表示商大于4;-mtime -4表示商小于4;-mtime 4表示商等于4。可以用下图表示:

    find 相关的时间参数意义
    find 相关的时间参数意义
  2. 与使用者或群组名称有关的参数
    • -uid n :n 为数字,这个数字是使用者的帐号 ID,在/etc/passwd中记录着。
    • -gid n :n 为数字,这个数字是群组名称的 ID,亦即 GID,在/etc/group记录着。
    • -user name :name 为使用者帐号名称喔!
    • -group name:name 为群组名称喔!
    • -nouser :寻找文件的拥有者不存在于 /etc/passwd 的人!
    • -nogroup :寻找文件的拥有群组不存在于 /etc/group 的文件!

    当你自行安装软件时,很可能该软件的属性当中并没有文件拥有者,这是可能的!在这个时候,就可以使用 -nouser 与 -nogroup 搜寻。

  3. 与档案权限及名称有关的参数
    • -name filename:搜寻档案名称为 filename 的档案;
    • -size [+-]SIZE:搜寻比 SIZE 还要大(+)或小(-)的档案。这个 SIZE 的规格有: c: 代表 byte, k: 代表 1024bytes。所以,要找比 50KB 还要大的档案,就是‘ -size +50k ’
    • -type TYPE :搜寻档案的类型为 TYPE 的,类型主要有:一般正规档案 (f), 装置档案 (b, c), 目录 (d), 连结档 (l), socket (s), 及 FIFO (p) 等属性。
    • -perm mode :搜寻档案权限‘刚好等于’ mode 的档案,这个 mode 为类似 chmod 的属性值,举例来说, -rwsr-xr-x 的属性为 4755 !
    • -perm -mode :搜寻档案权限‘必须要全部囊括 mode 的权限’的档案,举例来说, 我们要搜寻 -rwxr--r-- ,亦即 0744 的档案,使用 -perm -0744, 当一个档案的权限为 -rwsr-xr-x ,亦即 4755 时,也会被列出来, 因为 -rwsr-xr-x 的属性已经囊括了 -rwxr--r-- 的属性了。
    • -perm +mode :搜寻档案权限‘包含任一 mode 的权限’的档案,举例来说,我们搜寻 -rwxr-xr-x ,亦即 -perm +755 时,但一个档案属性为 -rw------- 也会被列出来,因为他有 -rw.... 的属性存在!
  4. 额外可进行的动作
  5. 示例如下:

    [root@andy tmp]# find / -perm +7000 -exec ls -l {} \;
                            -r-s--x--x. 1 root root 11728 May 16  2014 /usr/lib/virtualbox/VBoxVolInfo
                            -r-s--x--x. 1 root root 32624 May 16  2014 /usr/lib/virtualbox/VBoxNetNAT
                            -r-s--x--x. 1 root root 32624 May 16  2014 /usr/lib/virtualbox/VBoxNetDHCP
                            -r-s--x--x. 1 root root 32624 May 16  2014 /usr/lib/virtualbox/VBoxSDL
                            -r-s--x--x. 1 root root 15752 May 16  2014 /usr/lib/virtualbox/VBoxNetAdpCtl
                            -r-s--x--x. 1 root root 32624 May 16  2014 /usr/lib/virtualbox/VirtualBox
                            -r-s--x--x. 1 root root 32624 May 16  2014 /usr/lib/virtualbox/VBoxHeadless
                            -rws--x--x. 1 root root 20184 Nov 22  2013 /usr/bin/chfn
                            -rwsr-xr-x. 1 root root 71480 Dec  8  2011 /usr/bin/gpasswd
                            -rwxr-sr-x. 1 root nobody 125000 Nov 23  2013 /usr/bin/ssh-agent
                            ---s--x---. 1 root stapusr 170784 Nov 22  2013 /usr/bin/staprun
                            ...
                        [root@andy tmp]#

    该范例中特殊的地方有 {} 以及 \; 还有 -exec 这个关键字,这些东西的意义为:

参考资料

  1. 鸟哥的linux私房菜
    http://vbird.dic.ksu.edu.tw/linux_basic/0220filemanager.php