find命令学习总结


PS:由于本人水平有限,以下学习总结内容不能保证准确无误,请自行鉴别。


一、概述:

       有时可能需要在系统中查找具有某一特征的文件(例如文件权限、文件属主、文件长度、文件类型等等)。这样做可能有很多原因。可能出于安全性的考虑,或是一般性的系统管理任务,或许只是为了找出一个不知保存在什么地方的文件。find是一个非常有效的工具,它可以遍历当前目录甚至于整个文件系统来查找某些文件或目录。

Linux下还有其他四个查找命令分别是locate、whereis、which、type;下面我们对这四个命令进行一下简单的了解,本文重点总结find命令的使用。

题外扩展实例
locate




#搜索/etc/下以sh开头的文件或目录
[root@Tux ~]# locate /etc/sh
/etc/shadow
/etc/shadow-
/etc/shells
[root@Tux ~]#
#搜索用户主目录下,所有以a开头的文件
#,并且忽略大小写。
[root@Tux ~]# locate -i ~/a
/root/All.sh
/root/anaconda-ks.cfg
[root@Tux ~]#


  优点:数度快
  缺点:依赖于数据库、非实时查找、模糊查找结果的精确不高

locate命令其实是“find -name”的另一种写法,但是要比后者快得多,原因在于它不搜索具体目录,而是搜索一个数据库(/var/lib/locatedb),这个数据库中含有本地所有文件信息。Linux系统自动创建这个数据库,并且每天自动更新一次,所以使用locate命令查不到最新变动过的文件。为了避免这种情况,可以在使用locate之前,先使用updatedb命令,手动更新数据库。
whereis


#只搜索cat命令的二进制文件
[root@Tux ~]# whereis -b cat
cat: /bin/cat
[root@Tux ~]#
#只搜索grep命令的man说明文件
[root@Tux ~]# whereis -m grep
grep: /usr/share/man/man1/grep.1.gz
[root@Tux ~]#
whereis命令只能用于程序名的搜索,而且只搜索二进制文件(参数-b)、man说明文件(参数-m)和源代码文件(参数-s)。如果省略参数,则返回所有信息。
which




#搜索grep命令是否存在,并且在什么位置.
[root@Tux ~]# which grep
/bin/grep
[root@Tux ~]#


which命令的作用是,在PATH变量指定的路径中,搜索某个系统命令的位置,并且返回第一个搜索结果。也就是说,使用which命令,就可以看到某个系统命令是否存在,以及执行的到底是哪一个位置的命令。
type



[root@Tux ~]# type cd
cd is a shell builtin
#系统会提示,cd是shell的自带命令(build-in)。
[root@Tux ~]# type grep
grep is /bin/grep
#系统会提示,grep是一个外部命令,并显示该命令的路径。
[root@Tux ~]# type -p grep
/bin/grep
#加上-p参数后,就相当于which命令。
[root@Tux ~]#


type命令其实不能算查找命令,它是用来区分某个命令到底是由shell自带的,还是由shell外部的独立二进制文件提供的。如果一个命令是外部命令,那么使用-p参数,会显示该命令的路径,相当于which命令。


二、find命令的使用:

2.1 find命令的命令格式:

#find [查找路径] [options] [查找条件] [处理动作]
->查找路径:如果省略,则以当前目录查找
->查找条件:默认为查找指定路径下的所有文件
->处理动作:默认为显示,-print

2.2 find命令的常用命令选项[options]:

       find命令有很多选项或表达式,每一个选项前面跟随一个横杠-。让我们先来看一下该命令的主要选项,然后再给出一些例子。

-name FileName  →按照文件名称查找;支持Globbing(*,?,[],[^],)
-iname FileName  →按照文件名称查找;忽略大小写;支持Globbing(*,?,[],[^],)
-user UserName  →按照文件属主查找
-group GroupName  →按照文件属组查找
-uid UID  →按照用户UID查找
-gid GID →按照用户GID查找
-nouser  →查找无效属主的文件
-nogroup  →查找无效属组的文件
-type [Filetype]  →按照文件类型(包括以下类型)
    f  →普通文件
    d  →目录文件
    b  →块设备文件
    c  →字符设备文件
    L  →管道文件
    p  →命名管道文件
    s  →套接字文件
-size  →如果不加参数默认是字节
         [+|-]#K按着k的大小查找文件
         [+|-]#M按着M的大小查找文件
         [+|-]#G按着G的大小查找文件
——————————————————————————————
根据时间戳查找:
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           
   以天为单位:
    -mtime [+|-]n 更改过的时间
    -ctime [+|-]n 改变过的时间
    -atime [+|-]n 访问过的时间
    +n指n(不包含n天本身)天以前被更改过、改变过、访问过的文件
    -n指n天以内(含n天本身)被更改过、改变过、访问过的文件文件
    n则指在n天之前的"一天之内"被更改过、改变过、访问过的文件
    以分钟为单位:
    -mtime [+|-]n 更改过的时间
    -ctime [+|-]n 改变过的时间
    -atime [+|-]n 访问过的时间
    +n指n(不包含n分钟本身)分钟以前被更改过、改变过、访问过的文件
    -n指n分钟以内(含n分钟本身)被更改过、改变过、访问过的文件文件
    n则指在n分钟之前的"n分钟之内"被更改过、改变过、访问过的文件
——————————————————————————————
根据文件的权限查找:
    -perm  [+|-]mode
    +Mode 任何一类用户的任何一位权限位满足就匹配,常用于超找某类用户特定全选是否存在
    -Mode 每类用户的指定的权限位都满足就匹配
    当只有一位权限位判断时则可用+/-
    +可理解为或的关系,-可理解为且的关系
——————————————————————————————
组合条件:
    -a: 与,同时满足
    -o: 或,
    -not, !:非,取反
    非A,并且 非B: 非(A或B)
    非A,或 非B: 非(A且B)
——————————————————————————————
处理运作:
    默认的处理动作为-print:显示
    -ls 类似ls -l 以长格式输出各文件信息
    -exec COMMAND {} \; →对查找到的文件执行指定的的命令
    -ok COMMAND {} \; → 交互式的-exec
 find ....|xargs COMMAND
——————————————————————————————



三、find命令使用实例:

3.1

-name
#在/tmp目录下文件名为Bike的文件
[root@Maoqiu ~]# ls -l /tmp/
total 16
-rw-r--r-- 1 root root 1656 Feb 21 05:23 Bike
-rw-r--r-- 1 root root 1656 Feb 21 05:23 book
-rw-r--r-- 1 root root 1988 Feb 21 03:59 yumAutoInstall.sh
-rw-r--r-- 1 root root 1656 Feb 21 05:23 Yumrepo
[root@Maoqiu ~]# find /tmp/ -name "Bike"
/tmp/Bike
[root@Maoqiu ~]#

3.2

-iname
#在/tmp下文件名为y或者Y开头的文件
[root@Maoqiu ~]# find /tmp/ -iname "y*"
/tmp/Yumrepo
/tmp/yumAutoInstall.sh
[root@Maoqiu ~]#

3.3

-user
#在/tmp目录下搜索属于用户Suse的文件
[root@Maoqiu ~]# find /tmp -user "Suse" -type f
/tmp/suse_file1
[root@Maoqiu ~]#

3.4

-group
#在/tmp目录搜索下属于GROUP1组的文件
[root@Maoqiu tmp]# ll
total 20
-rw-r--r-- 1 root   root   1656 Feb 21 05:23 Bike
-rw-r--r-- 1 root   root   1656 Feb 21 05:23 book
-rw-r--r-- 1 fedora GROUP1 1816 Feb 21 10:00 fedora_file1
-rw-r--r-- 1 root   root   1988 Feb 21 03:59 yumAutoInstall.sh
-rw-r--r-- 1 root   root   1656 Feb 21 05:23 Yumrepo
[root@Maoqiu ~]# find /tmp/ -group "GROUP1"
/tmp/fedora_file1
[root@Maoqiu ~]#

3.5

-uid
#在/home下搜索属于uid为500用户的文件
[root@Maoqiu ~]# find /home/ -uid 504
/home/Suse
/home/Suse/.bash_logout
/home/Suse/.bash_history
/home/Suse/.gnome2
/home/Suse/.bash_profile
/home/Suse/.zshrc
/home/Suse/.bashrc
/home/Suse/.mozilla
/home/Suse/.mozilla/plugins
/home/Suse/.mozilla/extensions
[root@Maoqiu ~]#

3.6

-gid
#在/tmp下搜索属于gid为505组内成员的文件
[root@Maoqiu ~]# find /tmp/ -gid 505
/tmp/fedora_file1
[root@Maoqiu ~]#

3.7

-nouser/-nogroup
#在/tmp目录下搜索无效属主的文件
[root@Maoqiu ~]# ll /tmp/
total 18
-rw-r--r-- 1 fedora GROUP1 1816 Feb 21 10:00 fedora_file1
-rw-rw-r-- 1    504    504 1816 Feb 21 12:09 Suse_file1
-rw-r--r-- 1 root   root   1656 Feb 21 05:23 Yumrepo
[root@Maoqiu ~]# [root@Maoqiu ~]# find /tmp/ -nouser
/tmp/Suse_file1
[root@Maoqiu ~]#

3.8

-type
#在/dev目录下搜索字符设备文件
[root@Maoqiu tmp]# find /dev/ -type s
/dev/log
[root@Maoqiu tmp]# ls -ld /dev/log
srw-rw-rw- 1 root root 0 Feb 21 03:53 /dev/log
[root@Maoqiu tmp]#

3.9

-size
#在/tmp下文搜索文件等于20M的文件
[root@Maoqiu tmp]# ls -lh
total 61M
-rw-r--r-- 1 root root  10M Feb 21 18:05 aa
-rw-r--r-- 1 root root  20M Feb 21 18:06 bb
-rw-r--r-- 1 root root  30M Feb 21 18:06 cc
-rw-r--r-- 1 root root 2.0K Feb 21 03:59 yumAutoInstall.sh
-rw-r--r-- 1 root root 1.7K Feb 21 05:23 Yumrepo
[root@Maoqiu tmp]# find -size 20M #→如果查找路径省略,则代表当前
./bb
[root@Maoqiu tmp]#

3.10

-mtime/-atime/-ctime
#在/var/log目录下查找10天之前改变过的文件
[root@Maoqiu tmp]# date
Thu Feb 27 20:43:44 CST 2014
[root@Maoqiu tmp]# find /var/log/ -ctime +10
/var/log/httpd/
............
............
[root@Maoqiu tmp]# stat /var/log/httpd/
  File: `/var/log/httpd/'
  Size: 4096        Blocks: 8          IO Block: 4096   directory
Device: fd03h/64771d    Inode: 786474      Links: 2
Access: (0700/drwx------)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2014-02-27 20:39:33.917000020 +0800
Modify: 2013-02-22 19:20:58.000000000 +0800
Change: 2014-02-21 03:13:26.944994374 +0800
[root@Maoqiu tmp]#

3.11

-perm
#在/tmp下搜索至少有一类用执行权限的文件
[root@Maoqiu tmp]# ll
total 61448
-rw-r--r-x 1 root root 10485760 Feb 21 18:05 aa
-rw-r--r-- 1 root root 20971520 Feb 21 18:06 bb
-rw-r--r-- 1 root root 31457280 Feb 21 18:06 cc
-rw-r--r-- 1 root root     1988 Feb 21 03:59 yumAutoInstall.sh
-rw-r--r-- 1 root root     1656 Feb 21 05:23 Yumrepo
[root@Maoqiu tmp]# find /tmp -perm +111
/tmp
/tmp/aa
/tmp/.ICE-unix
[root@Maoqiu tmp]#

3.12

-not/-a/-o
#在/tmp目录下搜索不属于root,user1,或user2的文件
[root@Maoqiu tmp]# ll
total 20
-rw-r--r-- 1 root   root   1656 Feb 21 05:23 book
-rw-r--r-- 1 fedora GROUP1 1816 Feb 21 10:00 fedora_file1
-rw-rw-r-- 1    504    504 1816 Feb 21 12:09 Suse_file1
-rw-r--r-- 1 root   root   1988 Feb 21 03:59 yumAutoInstall.sh
-rw-r--r-- 1 root   root   1656 Feb 21 05:23 Yumrepo
[root@Maoqiu tmp]# find /tmp/ -not \( -user root -o -user user1 -o user2 \)
/tmp/fedora_file1
/tmp/Suse_file1
[root@Maoqiu tmp]#
##########注:在使用括号时一定需要\进行转义操作##########

3.13

处理动作-exec
#在/tmp目录下找出以doc为后缀的文件后将其把后缀更改为.docx
[root@Maoqiu tmp]# ls
aa  bb.doc  cc.doc  yumAutoInstall.doc  Yumrepo
[root@Maoqiu tmp]#
[root@Maoqiu tmp]# find /tmp  -name "*.doc" -exec mv {} {}x \;
[root@Maoqiu tmp]# ls
aa  bb.docx  cc.docx  yumAutoInstall.docx  Yumrepo
[root@Maoqiu tmp]#