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]# |