find的使用说明与事例

find的使用说明与事例

欢迎来到 来到大浪涛天的博客

find的使用说明与事例

1. 语法

find [OPTION]... [查找路径] [查找条件] [处理动作]
  • 查找路径:指定具体目标路径;默认为当前目录;

  • 查找条件:指定的查找标准,可以文件名、大小、类型、权限等标准进行;默认为找出指定路径下的所有文件;

  • 处理动作:对符合条件的文件做什么操作;默认输出至屏幕;

1.1 查找条件:

1.1.1 根据文件名查找:

  • -name "文件名称":支持使用glob(*, ?, [], [^])

  • -iname "文件名称":不区分字母大小写

  eg: find /tmp -iname "Fun*" |xargs rm -rf

-regex "PATTERN":以PATTERN匹配整个文件路径字符串,而不仅仅是文件名称;

1.1.2 根据属主、属组查找:

  • -user USERNAME:查找属主为指定用户的文件;

eg :[root@localhost tmp]# find /tmp -user "test100"

  • group GRPNAME: 查找属组为指定组的文件;

eg:find /tmp -group "test100"

  • -uid UserID:查找属主为指定的UID号的文件;

eg: find /tmp/ -uid "1099"

  • -gid GroupID:查找属组为指定的GID号的文件;

eg : find /tmp/ -gid "1099"

  • -nouser:查找没有属主的文件;

eg:find /tmp -nouser

  • -nogroup:查找没有属组的文件;

eg:find /tmp -nogroup

1.1.3 根据文件类型查找:

  • -type TYPE:

  • f: 普通文件

  • d: 目录文件

  • l: 符号链接文件

  • s:套接字文件

  • b: 块设备文件

  • c: 字符设备文件

  • p: 管道文件

1.1.4 根据文件大小来查找:

-size [+|-]#UNIT(-size,然后+或者-接上数字然后接上单位)
常用单位:k, M, G
UNIT: (#-1, #](unit指单位,#指数字,例如正好是3k则是大于3-1,小于等于3)
-#UNIT:[0,#-1](如果是-3k,则表示大于等于0,小于等于2k)
+#UNIT:(#,oo) (如果是+3k ,则表示大于3k)
例如:

[root@localhost tmp]# find ./ -size 5k -exec ls -lh {} \; 
-rw-r--r--. 1 root root 5.0K Feb  9 05:38 ./DIR_COLORS
-rw-r--r--. 1 root root 4.6K Feb  9 05:38 ./DIR_COLORS.lightbgcolor
-rw-r--r--. 1 root root 5.0K Feb  9 05:37 ./passwd
[root@localhost tmp]# find ./ -size -5k -exec ls -lh {} \; 
-rw-r--r--. 1 root root 2.9K Feb  9 05:38 ./bashrc
-rw-r--r--. 1 root root 2.4K Feb  9 05:38 ./libuser.conf
[root@localhost tmp]# find ./ -size +5k -exec ls -lh {} \;
-rw-r--r--. 1 root root 12K Feb  9 05:38 ./aliases.db
-rw-r--r--. 1 root root 5.6K Feb  9 05:38 ./DIR_COLORS.256color
-rw-r--r--. 1 root root 7.1K Feb  9 05:38 ./kdump.conf

1.1.5 根据时间戳:

  • 以“天”为单位;
-atime [+|-]#, (-time,然后+或者-接上数字)
 #: [#,#+1),(#,代表数字,如果是3天,则代表大于等于3天,小于4天,3天以前,4天以内)
+#: [#+1,oo] (如果是3代表,大于等于4天,也就是4天以前)
-#: [0,#) (如果#是3,则表示小于3,3天以内)
a是指access 接入时间,当cat或者cd文件或者目录时,a会改变。
-mtime(modify改变时间),当改变文件权限时改时间不变,但是当改变文件内容时这个时间会发生改变。
-ctime(change 时间),当改变文件内容或者改变文件时间时c都会发生改变。
如果检查一个时间段文件内容的修改则通常用mtime

以“分钟”为单位:

  • -amin
  • -mmin
  • -cmin
    例如:
[root@localhost tmp]# date
Fri Feb  9 07:11:32 CST 2018
[root@localhost tmp]# stat * |grep Access
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2018-02-06 05:00:00.000000000 +0800
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2018-02-07 05:00:00.000000000 +0800
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2018-02-03 05:00:00.000000000 +0800
[root@localhost tmp]# find ./ -mtime 3
[root@localhost tmp]# find ./ -atime 3 
./a
[root@localhost tmp]# find ./ -atime -3
./
./b
[root@localhost tmp]# find ./ -atime +3
./c
[root@localhost tmp]# 
插入话题一:如果改变文件的时间戳,
[root@localhost tmp]# touch -a -t 201804090830.00 a  
[root@localhost tmp]# stat a
  File: ‘a’
  Size: 6               Blocks: 8          IO Block: 4096   regular file
Device: 803h/2051d      Inode: 33575688    Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Context: unconfined_u:object_r:user_tmp_t:s0
Access: 2018-04-09 08:30:00.000000000 +0800

1.1.6 根据权限查找:

  • -perm [/|-]MODE

  • MODE: 精确权限匹配

  • /MODE:任何一类(u,g,o)对象的权限中只要能一位匹配即可;

  • -MODE:每一类对象都必须同时拥有为其指定的权限标准;

1.1.7 处理动作:

  • -print:默认的处理动作,显示至屏幕;

  • -ls:类似于对查找到的文件执行“ls -l”命令;

  • -delete:删除查找到的文件;

  • -fls /path/to/somefile:查找到的所有文件的长格式信息保存至指定文件中;

  • -ok COMMAND {} ; 对查找到的每个文件执行由COMMAND指定的命令;

  • 对于每个文件执行命令之前,都会交互式要求用户确认;

  • -exec COMMAND {} ; 对查找到的每个文件执行由COMMAND指定的命令;

  • {}: 用于引用查找到的文件名称自身;

注意:find传递查找到的文件至后面指定的命令时,查找到所有符合条件的文件一次性传递给后面的命令;

有些命令不能接受过多参数,此时命令执行可能会失败;另一种方式可规避此问题:

find | xargs COMMAND

2.1 组合条件:

  • 与:-a

  • 或:-o

  • 非:-not, !

!A -a !B = !(A -o B)
!A -o !B = !(A -a B)

找出/tmp目录下,属主不是root,且文件名不是fstab的文件;

find /tmp \( -not -user root -a -not -name "fstab" \) -ls
find /tmp -not \( -user root -o -name "fstab" \) -ls

切记,参数前面均要加横杆,-user -a -not -name -group,如果提示下列错误就要想到是不是没有加横杆

[root@localhost ~]# find /tmp -not -user root -a -not group root
find: paths must precede expression: group
Usage: find [-H] [-L] [-P] [-Olevel] [-D help|tree|search|stat|rates|opt|exec] [path...] [expression]
[root@localhost ~]# find /tmp -not -user root -a -not -group root
/tmp/file7
/tmp/file8
/tmp/file9
/tmp/file10
find /tmp -not -user root -a -not -group root -ls
find /tmp \( -not -user root -a -not -group root \) -ls
find /tmp -not \(  -user root -o -group root \) -ls 
posted @ 2020-04-25 19:11  OuYangTao  阅读(169)  评论(0编辑  收藏  举报