find命令
find程序可以依据文件的各种属性在目录或者其子目录里查找,他是一种实时查找工具,通过遍历指定路径完成文件查找。
一.语法
find [-H] [-L] [-P] [-D debugopts] [-Olevel] [path…] [expression]
find [OPTION]… [查找路径] [查找条件] [处理动作]
查找路径:指定具体目标路径;默认为当前目录
查找条件:指定的查找标准,可以文件名、大小、类型、权限等标准进行;默认为找出指定路径下的所有文件
处理动作:对符合条件的文件做操作,默认输出至屏幕
二.通过查找条件使用find命令
1.指定搜索层级
-maxdepthlevel 最大搜索目录深度,指定目录为第1级
-mindepthlevel 最小搜索目录深度
示例:
[root@localhost etc]$find -maxdepth 3 | less
.
./fstab
./crypttab
./mtab
./resolv.conf
./fonts
./fonts/conf.d
./fonts/conf.d/65-0-lohit-bengali.conf
./fonts/conf.d/20-unhint-small-dejavu-sans.conf
./fonts/conf.d/57-dejavu-sans.conf
./fonts/conf.d/65-0-lohit-kannada.conf
./fonts/conf.d/10-scale-bitmap-fonts.conf
./fonts/conf.d/57-paratype-pt-sans.conf
./fonts/conf.d/20-unhint-small-vera.conf
./fonts/conf.d/20-unhint-small-dejavu-serif.conf
./fonts/conf.d/25-no-bitmap-fedora.conf
./fonts/conf.d/57-dejavu-serif.conf
./fonts/conf.d/25-unhint-nonlatin.conf
./fonts/conf.d/66-ucs-miscfixed.conf
./fonts/conf.d/30-metric-aliases.conf
./fonts/conf.d/30-urw-aliases.conf
./fonts/conf.d/40-nonlatin.conf
./fonts/conf.d/45-latin.conf
./fonts/conf.d/49-sansserif.conf
./fonts/conf.d/50-user.conf
./fonts/conf.d/51-local.conf
./fonts/conf.d/60-latin.conf
maxdepth 搜索最大目录深度,数字3意思是最多只搜索到第3级目录不会再向下搜索了,
第3级目录是搜索的最终
[root@localhost etc]$find -mindepth 3 | less
./fonts/conf.d/65-0-lohit-bengali.conf
./fonts/conf.d/20-unhint-small-dejavu-sans.conf
./fonts/conf.d/57-dejavu-sans.conf
./fonts/conf.d/65-0-lohit-kannada.conf
./fonts/conf.d/10-scale-bitmap-fonts.conf
./fonts/conf.d/57-paratype-pt-sans.conf
./fonts/conf.d/20-unhint-small-vera.conf
./fonts/conf.d/20-unhint-small-dejavu-serif.conf
./fonts/conf.d/25-no-bitmap-fedora.conf
./fonts/conf.d/57-dejavu-serif.conf
./fonts/conf.d/25-unhint-nonlatin.conf
./fonts/conf.d/66-ucs-miscfixed.conf
./fonts/conf.d/30-metric-aliases.conf
./fonts/conf.d/30-urw-aliases.conf
./fonts/conf.d/40-nonlatin.conf
./fonts/conf.d/45-latin.conf
./fonts/conf.d/49-sansserif.conf
./fonts/conf.d/50-user.conf
./fonts/conf.d/51-local.conf
./fonts/conf.d/60-latin.conf
./fonts/conf.d/65-0-ttf-arphic-uming.conf
./fonts/conf.d/65-fonts-persian.conf
./fonts/conf.d/65-nonlatin.conf
./fonts/conf.d/69-unifont.conf
./fonts/conf.d/80-delicious.conf
./fonts/conf.d/90-synthetic.conf
./fonts/conf.d/README
-mindepth 搜索最小目录深度,数字3意思是搜索是从第3级目录开始的,
然后搜索到最后子目录及子文件
2.根据文件名和inode查找
选项 | 说明 |
---|---|
-name | “文件名称”:支持使用glob *, ?, [], [^] |
-iname | “文件名称”:不区分字母大小写 |
-inumn | 按inode号查找 |
-samefile name | 相同inode号的文件 |
-links n | 链接数为n的文件 |
-regex“PATTERN” | 以PATTERN匹配整个文件路径,而非文件名称 |
查看文件的inode号用到的命令是 ls -i
示例:
[root@localhost etc]$find -name passwd
./passwd
./pam.d/passwd
[root@localhost etc]$ls -i passwd
9674858 passwd
[root@localhost etc]$find -inum 9674858
./passwd
find -links n这里的这个链接数指的是硬链接,查看链接数应该用stat这个命令。
示例:
[root@localhost etc]$stat . <----查看在etc目录下硬链接数
File: ‘.’
Size: 8192 Blocks: 24 IO Block: 4096 directory
Device: 805h/2053d Inode: 8409153 Links: 139 <--此处为硬链接数
Access: (0755/drwxr-xr-x) Uid: ( 0/ root) Gid: ( 0/ root)
Context: system_u:object_r:etc_t:s0
Access: 2019-08-31 16:17:52.042755794 +0800
Modify: 2019-08-31 11:41:58.651048832 +0800
Change: 2019-08-31 11:41:58.651048832 +0800
Birth: -
[root@localhost etc]$find -links 10 <----查看在etc目录下硬链接数为10的目录
./pki
./rc.d
[root@localhost etc]$stat rc.d <----查看在rc.d的目录硬链接数是否为10
File: ‘rc.d’
Size: 127 Blocks: 0 IO Block: 4096 directory
Device: 805h/2053d Inode: 6984 Links: 10
Access: (0755/drwxr-xr-x) Uid: ( 0/ root) Gid: ( 0/ root)
Context: system_u:object_r:etc_t:s0
Access: 2019-08-31 20:02:30.612517189 +0800
Modify: 2019-08-06 22:50:15.685992906 +0800
Change: 2019-08-06 22:50:15.685992906 +0800
Birth: -
以PATTERN匹配整个文件路径,匹配的字符串一定是文件的路径,支持正则表达
[root@localhost etc]$find -regex ".*/pas.*"
./openldap/certs/password
./passwd
./selinux/targeted/active/modules/100/passenger
./selinux/targeted/active/modules/100/passenger/cil
./selinux/targeted/active/modules/100/passenger/hll
./selinux/targeted/active/modules/100/passenger/lang_ext
./pam.d/passwd
./pam.d/password-auth-ac
./pam.d/password-auth
./passwd-
3.根据属主、属组查找
选项 | 说明 |
---|---|
-user USERNAME | 查找属主为指定用户(UID)的文件 |
-group GRPNAME | 查找属组为指定组(GID)的文件 |
-uid UserID | 查找属主为指定的UID号的文件 |
-gid GroupID | 查找属组为指定的GID号的文件 |
-nouser | 查找没有属主的文件 |
-nogroup | 查找没有属组的文件 |
# 查找/var目录下属主为root,且属组为mail的所有文件
[root@localhost ~]$find /var -user root -a -group mail
/var/spool/mail
#查找/var目录下不属于root、lp、gdm的所有文件
[root@localhost ~]$ find /var ! \( -user root -o -user lp -o -user gdm \)
/var/tmp/abrt
/var/tmp/yum-mrlin-k1GJoC
/var/tmp/yum-mrlin-k1GJoC/x86_64
/var/tmp/yum-mrlin-k1GJoC/x86_64/7
/var/tmp/yum-mrlin-k1GJoC/x86_64/7/base
/var/tmp/yum-mrlin-k1GJoC/x86_64/7/base/gen
/var/tmp/yum-mrlin-k1GJoC/x86_64/7/base/packages
/var/tmp/yum-mrlin-k1GJoC/x86_64/7/base/repomd.xml
/var/tmp/yum-mrlin-k1GJoC/x86_64/7/base/cachecookie
/var/tmp/yum-mrlin-k1GJoC/x86_64/7/base/mirrorlist.txt
/var/tmp/yum-mrlin-k1GJoC/x86_64/7/extras
...
...
...
4.根据文件类型查找
-type TYPE:
选项 | 说明 |
---|---|
b | 块设备文件 |
c | 字符设备文件 |
d | 目录 |
f | 普通文件 |
l | 符号链接文件 |
s | 套接字文件 |
p | 管道文件 |
#通过find -type d查看etc下的目录
[root@localhost etc]$find -type d |head -n10
.
./fonts
./fonts/conf.d
./grub.d
./X11
./X11/fontpath.d
./X11/applnk
./X11/xinit
./X11/xinit/Xclients.d
./X11/xinit/xinitrc.d
#通过find -type f查看etc下的普通文件
[root@localhost etc]$find -type f | head -n10
./fstab
./crypttab
./resolv.conf
./fonts/conf.d/25-no-bitmap-fedora.conf
./fonts/conf.d/README
./fonts/fonts.conf
./grub.d/00_header
./grub.d/01_users
./grub.d/10_linux
./grub.d/20_linux_xen
5.根据操作符查找
组合条件:
与:-a
或:-o
非:-not, !
德·摩根定律:
(非A) 或(非B) = 非(A 且B)
(非A) 且(非B) = 非(A 或B)
6.根据权限查找
-perm [/|-]MODE
MODE: 精确权限匹配
/MODE:任何一类(u,g,o)对象的权限中只要能一位匹配即可,或关系,+ 从centos7开始淘汰
-MODE:每一类对象都必须同时拥有指定权限,与关系
0 表示不关注
精确查找匹配644的文件,再过滤出passwd验证
[root@localhost etc]$find . -perm 644 | grep passwd
./passwd
./pam.d/passwd
./passwd-
[root@localhost etc]$ll passwd
-rw-r--r--. 1 root root 2279 Aug 18 12:26 passwd
只有当每个人都有写权限时
[root@localhost etc]$find . -perm -222 | head -n10
./mtab
./fonts/conf.d/65-0-lohit-bengali.conf
./fonts/conf.d/20-unhint-small-dejavu-sans.conf
./fonts/conf.d/57-dejavu-sans.conf
./fonts/conf.d/65-0-lohit-kannada.conf
./fonts/conf.d/10-scale-bitmap-fonts.conf
./fonts/conf.d/57-paratype-pt-sans.conf
./fonts/conf.d/20-unhint-small-vera.conf
./fonts/conf.d/20-unhint-small-dejavu-serif.conf
./fonts/conf.d/57-dejavu-serif.conf
只有当其它人(other)有读权限时
[root@localhost etc]$find . -perm -004 | head -n10
.
./fstab
./mtab
./resolv.conf
./fonts
./fonts/conf.d
./fonts/conf.d/65-0-lohit-bengali.conf
./fonts/conf.d/20-unhint-small-dejavu-sans.conf
./fonts/conf.d/57-dejavu-sans.conf
./fonts/conf.d/65-0-lohit-kannada.conf
查找访问权限不是0600的文件和访问权限不是0700的子目录
[root@localhost etc]$find . \( -type f -not -perm 0600 \) -or \( -type d -not -perm 0700 \) | head -n10
.
./fstab
./resolv.conf
./fonts
./fonts/conf.d
./fonts/conf.d/25-no-bitmap-fedora.conf
./fonts/conf.d/README
./fonts/fonts.conf
./grub.d/00_header
./grub.d/01_users
7.根据文件大小来查找
-size [+|-]#UNIT
常用单位:k, M, G,c(byte)
#UNIT: (#-1, #]
如:6k 表示(5k,6k]
-#UNIT:[0,#-1]
如:-6k 表示[0,5k]
+#UNIT:(#,∞)
如:+6k 表示(6k,∞)
8.根据时间戳
时间类型 | 动作 | 表达方式 |
---|---|---|
访问时间 | Access | atime |
修改时间 | Modify | mtime |
状态改动时间 | Change | ctime |
通过stat命令查看etc目录的三个时间戳
[root@localhost etc]$stat /etc
File: ‘/etc’
Size: 8192 Blocks: 24 IO Block: 4096 directory
Device: 805h/2053d Inode: 8409153 Links: 139
Access: (0755/drwxr-xr-x) Uid: ( 0/ root) Gid: ( 0/ root)
Context: system_u:object_r:etc_t:s0
Access: 2019-08-31 16:17:52.042755794 +0800
Modify: 2019-08-31 11:41:58.651048832 +0800
Change: 2019-08-31 11:41:58.651048832 +0800
Birth: -
以“天”为单位
-atime[+|-]#,
#: [#,#+1)
+#: [#+1,∞]
-#: [0,#)
-mtime
-ctime
以“分钟”为单位
-amin
-mmin
这里使用了一张鸟哥Linux私房菜里的一张图。
图中最右边为目前的时间,越往左边则代表越早之前的时间轴啦。由图我们可以清楚的知道:
+4代表大于等于5天前的档名:ex> find /var -mtime +4
-4代表小于等于4天内的档案档名:ex> find /var -mtime -4
4则是代表4-5那一天的档案档名:ex> find /var -mtime 4
find /usr -mtime -4 查找文件更新日时在距现在时刻4天以内的文件
find /usr -mtime +4 查找文件更新日时在距现在时刻5天以上的文件
find /usr -mtime 4 查找文件更新日时在距现在时刻4天以上5天以内的文件
示例:
查找文件更新日期在距现在时刻4天以内的文件
[root@localhost etc]$find . -mtime -4
.
./resolv.conf
./selinux
./selinux/config
./tuned/active_profile
./tuned/profile_mode
./cups
./cups/subscriptions.conf.O
./cups/subscriptions.conf
查找文件更新日时在距现在时刻5天以上的文件
[root@localhost etc]$find . -mtime +4 | head -n10
./fstab
./crypttab
./mtab
./fonts
./fonts/conf.d
./fonts/conf.d/65-0-lohit-bengali.conf
./fonts/conf.d/20-unhint-small-dejavu-sans.conf
./fonts/conf.d/57-dejavu-sans.conf
./fonts/conf.d/65-0-lohit-kannada.conf
./fonts/conf.d/10-scale-bitmap-fonts.conf
查找文件更新日时在距现在时刻4天以上5天以内的文件
[root@localhost etc]$find . -mtime 4
三.处理动作
动作 | 说明 |
---|---|
默认的处理动作,显示至屏幕 | |
-ls | 类似于对查找到的文件执行“ls -l”命令 |
-delete | 删除查找到的文件 |
-fls file | 查找到的所有文件的长格式信息保存至指定文件中 |
-quit | 一旦匹配成功便退出 |
-ok COMMAND {} ; | 对查找到的每个文件执行由COMMAND指定的命令,对于每个文件执行命令之前,都会交互式要求用户确认(也就是会执行之前询问) |
-exec COMMAND {} ; | 对查找到的每个文件执行由COMMAND指定的命令(不询问) |
-print是默认选项,意即:
[root@localhost etc]$ find .
#相当于
[root@localhost etc]$ find . -print
-delete选项,例如find查找.bak文件,查找到后就删除
[root@localhost etc]$ find . -type f -name '*.bak' -delete