Fork me on GitHub
KeKe Blog

find命令

学习和工作中,遇见比较多需要使用find命令查找文件,最初的时候也只是用来查找文件,但是没有深入的学习和了解。到后面开始接触自主运维的游戏时,每天会生成很多备份的数据库文件。为了对相关的日志进行定期清理,需要使用到find命令和ctime选项对备份目录内的文件进行筛选和过滤,保留7天的游戏数据库数据。再后来慢慢的需求多了,也学会了使用-type选项,通过文件类型来查询文件。
目前来说find的使用还是比较浅显,还需要多看看他人的实例。

1 find基础

1.1 命令格式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
find path -option [ -print ] [ -exec -ok command ] {} \;
#pathname: find命令所查找的目录路径。例如用.来表示当前目录,用/来表示系统根目录。
#-print: find命令将匹配的文件输出到标准输出。
#-exec: find命令对匹配的文件执行该参数所给出的shell命令。相应命令的形式为'command' { } \;,注意{ }和\;之间的空格。
#-ok: 和-exec的作用相同,只不过以一种更为安全的模式来执行该参数所给出的shell命令,在执行每一个命令之前,都会给出提示,让用户来确定是否执行。
#-print 将查找到的文件输出到标准输出
#-exec command {} \;—–将查到的文件执行command操作,{} 和 \;之间有空格
#-ok 和-exec相同,只不过在操作前要询用户

1.2 选项参数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
-name filename #查找名为filename的文件
-perm #按执行权限来查找
-user username #按文件属主来查找
-group groupname #按组来查找
-mtime -n +n #按文件更改时间来查找文件,-n指n天以内,+n指n天以前
-atime -n +n #按文件访问时间来查GIN: 0px">
-ctime -n +n #按文件创建时间来查找文件,-n指n天以内,+n指n天以前
-nogroup #查无有效属组的文件,即文件的属组在/etc/groups中不存在
-nouser #查无有效属主的文件,即文件的属主在/etc/passwd中不存
-newer f1 !f2 #找文件,-n指n天以内,+n指n天以前
-ctime -n +n #按文件创建时间来查找文件,-n指n天以内,+n指n天以前
-nogroup #查无有效属组的文件,即文件的属组在/etc/groups中不存在
-nouser #查无有效属主的文件,即文件的属主在/etc/passwd中不存
-newer f1 !f2 #查更改时间比f1新但比f2旧的文件
-type b/d/c/p/l/f #查是块设备、目录、字符设备、管道、符号链接、普通文件
-size n[c] #查长度为n块[或n字节]的文件
-depth #使查找在进入子目录前先行查找完本目录
-fstype #查更改时间比f1新但比f2旧的文件
-type b/d/c/p/l/f #查是块设备、目录、字符设备、管道、符号链接、普通文件
-size n[c] #查长度为n块[或n字节]的文件
-depth #使查找在进入子目录前先行查找完本目录
-fstype #查位于某一类型文件系统中的文件,这些文件系统类型通常可 在/etc/fstab中找到
-mount #查文件时不跨越文件系统mount点
-follow #如果遇到符号链接文件,就跟踪链接所指的文件
-cpio %; #查位于某一类型文件系统中的文件,这些文件系统类型通常可 在/etc/fstab中找到
-mount #查文件时不跨越文件系统mount点
-follow #如果遇到符号链接文件,就跟踪链接所指的文件
-cpio #对匹配的文件使用cpio命令,将他们备份到磁带设备中
-prune #忽略某个目录

2 查找条件

2.1 根据名称查找

2.2 根据文件从属关系

2.3 根据文件的类型

1
-type option : 根据不同的文件类型筛选
选项 含义
f 普通文件
d 目录文件
l 符号链接文件
b 块设备文件
c 字符设备文件
p 管道文件
s 套接字文件

2.4 根据文件的大小

1
2
3
4
5
6
-size [+|-] #UNIT
#常用单位 : k,M,G
#UNIT:(#-1, #]
-#UNIT:[0,#-1]
+#UNIT:(#, oo)

2.5 根据时间戳

1
2
3
atime : #文件最后访问时间;
mtime : #文件的最后修改时间;
ctime : #文件最后改变的时间;

2.5.1 以天为单位

  • -atime [+|-]#
1
2
3
4
5
6
7
8
# : [#, #-1)
最后访问时间在#天前(大于等于#天,小于#-1天前);等价于最后访问时间与当前的时间差大于(#-1)*24小时,小于等于#*24小时。
-# : (#, 0]
最后访问时间在#天以内,不包括24小时前的那一刻;等价于最后访问时间与当前的时间差小于#*24小时。
+# : (oo, #-1)
最后访问时间在#-1天以前,包括#-1天前;等价于最后访问时间与当前的时间差大于等于#*24小时。
  • -mtime
  • -ctime

2.5.2 以小时为单位

2.5.3 以分钟为单位

1
-daystart : 时间条件的开始先决条件。如果没有的时候,比较的开始时间为当前时间。如果有此参数,则比较的开始时间为当天的23:59:59。

2.6 根据权限查找

1
2
3
4
5
-perm [/|-]mode
mode : 精确权限匹配;
/mode : 任何一类用户(u,g,o)的权限中的任何一位(r,w,x)符合条件即满足;9位权限之间存在“或”关系;
-mode : 每一类用户(u,g,o)的权限中的每一位(r,w,x)同时符合条件即满足;9位权限之间存在“与”关系;

2.6.1 精确查找

  就是匹配权限值完全相等。

2.6.2 /model

  只要有一组用户匹配到一个权限即可。
  通俗说:就是属主拥有给定属主权限的某一个,或者数组拥有给定权限的某一个,或者其他用户拥有给定权限的某一个即可。

2.6.3 -mode

  存在并且的关系。
  通俗说:就是给定的属主权限必须拥有。并且给定的数组权限必须拥有。并且给定的其他用户权限必须拥有。

2.6.4 处理动作

参数 操作内容
-print 输出至标准输出;默认的动作;
-ls 类似与对查找到的文件执行“ls -l”命令,输出文件的详细信息;
-delete 删除查找到的文件;
-fls /PATH/TO/SOMEFILE 把查找到的所有文件的长格式信息保存到指定文件中;
-ok COMMAND {} \ 对查找到的每个文件执行由COMMAND表示的命令;每次操作都由用户进行确认;
-exec COMMAND {} \ 对查找到的每个文件执行由COMMAND表示的命令;
  • 注意
      find传递查找到的文件路径至后面的命令时,是先查找出所有符合条件的文件路径,并一次性传递给后面的命令;有些命令不能接受过长的参数,此时命令执行会失败。

  处理办法

1
find | xargs COMMAND

3 常用实例

  • 空目录/空文件
1
find /dir -depth -type d/f -empty
  • 根据名字查找
1
find /dir -name file_name
  • 根据扩展名查找
1
find /dir -name "*.txt"
  • 具有特殊权限且特定扩展名的文件
1
find /dir -name ".txt" -perm 644
  • 根据文件具有的权限属性查找
1
find /dir -perm -permision_bits
  • 未知拓展名,使用文件名查找
1
find /dir -name "test.*"
  • 在24小时内修改过的文件
1
2
3
4
5
6
find /dir -mtime n
# n的值:
# 0表示24小时
# 1表示48小时
# 2表示72小时
  • 最近24小时内存取过的文件
1
find /dir -atime n
  • 根据所有者查找文件
1
find /dir -user root
  • 查重并删除文件
1
find /dir -name my_test_file | xargs rm
  • 查找2017-03-03到2017-03-28之间的文件
1
find /dir -name test_file -newermt '2017-03-03' ! -newermt '2013-03-28'
  • 3天”以前”被改动过的文件 (前第三天以前 → 2011/09/05 12:00 以前的文件) (> 72 小时)
1
find /var/log/ -mtime +3 -type f -print
  • 3天內被改动过的文件 (2011/09/05 12:00 ~ 2011/09/08 12:00 內的文件) (0 ~ 72 小时內)
1
find /var/log/ -mtime -3 -type f -print
  • 前第 3 天被改动过的文件 (2011/09/04 12:00 ~ 2011/09/05 12:00 內的文件) (72 ~ 96 小时)
1
2
3
find /var/log/ -mtime 3 -type f -print
find /var/log/ -mtime +2 -mtime -4 -type f -print
-------------本文结束 感谢您的阅读-------------