Linux基础知识之find命令的用法
对文件名进行精确查找的命令----find
Find命令的格式:
# find [patn..] [expression]
但是我们按以下方法写会容易理解:
# find [查找路径] [查找标准] [处理动作]
其中[ ]中的内容是可以省略的,若省略查找目录,则默认的路径就是当前目录
若省略查找标准,则默认为指定路径下的所有文件
若省略处理动作:则默认为显示到屏幕上
查找路径:即在哪个路径目录下查找所需要的文件
查找标准:即通过什么方式来查找(或叫匹配)文件名,是根据选项(options)来指定的,例如-name、-type、-regex等
处理动作:即找到文件后该怎么办,例如-ls、-ok、-exec等
查找(匹配)标准:
根据文件的名称来查找:
-name ‘FILENAME':即对文件名作精确匹配,在对文件名匹配的时候还可以用文件名通配进行匹配操作
文件名的通配符:
* :表示任意长度的任意字符
?:表示任意单个字符
[]:表示任意范围内的单个字符
例如# find /etc -name 'passwd' 表示查找在/etc目录下,文件名为passwd的文件
# find /etc -name 'passwd*' 表示查找在/etc目录下,文件名以passwd开头,后跟任意长度任意字符的文件
# find /etc -name '*passwd*' 表示查找在/etc目录下,文件名中含有passwd这个字符串的文件
需要注意的是若用-name做文件名匹配的时候,是严格区分大小写来查找的
-iname ’FILENAME':根据匹配文件名不区分大小写
根据基础正则表达式来查找:
-regex PATTERN:基于基础正则表达式的模式对文件名进行查找,因为我们并没有指定-regex的type,所以默认的是基础正则表达式
根据文件的属性来查找:
-user USERNAME:根据文件的属主进行查找
例如# find /tmp/hadoop -user student查找属主是student的文件在/tmp/hadoop文件下
-group GROUPNAME:根据文件的属组进行查找
-uid UID:根据文件的属主号进行查找 它的意义在于:一旦文件的属主用户被删掉了,则此时文件属主号会变为该用户之前的UID号,此时就必须用UID号进行查找
-gid GID:根据文件的属组号进行查找 意义同上
-nouser: 查找没有属主的文件 它的应用意义在于:帮助管理员定期查看哪个文件是没有属主,并回收这些文件,以防至其他用户通过此文件攻击系统
-nogroup:查看没有属组的文件
根据文件的类型来查找:
-type:根据文件的类型来查找,文件类型分为很多种,如普通文件,目录文件,字符设备文件,块设备文件,连接文件文件,管道文件,套接字文件如下所示:
f:普通文件
d:目录文件
c:字符文件
b:块文件
l:连接文件
p:管道文件
s:套接字文件
例如查看tmp下的目录
# find /tmp -type d
# find /tmp -type c
根据文件的大小来查找:
-size [+|-]#[kMG]:根据文件的大小来查找,这里#用数字替代
#k:按照KB的大小来匹配文件,#表示数字虽然它的含义似乎精确匹配#k的文件,但实际上匹配到的文件都是离#最近的,因此所有小于#k和#k的文件都认为是#k所匹配的文件
#M:按照M的大小来匹配文件
#G:按照G的大小来匹配文件
[+|-]#k :+#k是查找大于#k的文件;-#k是查找小于#k的文件
例如# find /etc -size 10M (这里必须是find 后面跟路径)
扩展知识:一次性完成多个条件的查找,这时我们用组合条件
组合条件:这里同if条件语句的组合条件是相通的
-a :代表“与”条件
-o :代表“或”条件
-not :代表“非”条件
这里需要注意的是:-a的优先级是大于-o的
若给出两个条件但是没有指出他们的连接条件的话,默认为他们之间是“与”关系
例如 # find /etc -type d -size 10k 查找类型是d 并且是10k大小的文件在/etc下
练习
/tmp目录下,查找不是目录类型,而且还不能是套接字类型的文件
# find /tmp -not -file d -not -type s
/tmp/test目录下,查找属主不是user1,也不是user2的文件:
# find /tmp/test -not -user user1 -a -not user2 或 # find /tmp/test -not \(-user user1 –o -user user2 \)
摩根定律:
还能根据文件的时间戳来查找:
-mtime [+|-]#:根据修改时间来查找文件 #表示时间,一般单位是天
-ctime [+|-]# :根据改变时间
-atime [+|-]# :根据访问时间
以-atime [+|-]# 为例 -atime -5:表示查找离现在起#天内被访问过的文件 -atime +5:表示查找至少有5天没有被访问过的文件,既#天之前曾访问过的文件
-atime 5: 表示离现在正好5天,曾访问过
-amin [+|-]# :表示分钟,其他的跟上面相同
-cmin [+|-]#
-amin [+|-]#
根据文件的权限来查找:
-perm [+|/]MODE:根据文件的权限来查找,其中MODE表示文件的权限,一般换算为数值,例如644,777等 这里要注意的是:直接用-perm MODE(既权限):是精确MODE匹配查找
-perm -MODE :表示查找只有文件权限能完全包含此MODE时才能显示
-perm /MODE :表示要查找的文件9位权限中但凡有一位符合就可以被找到
find ./ -perm -001 其他人有执行权限
find ./ -perm -022 组有写权限,其他人也有写权限
find的处理动作:
-print:显示出来即默认的形式
-
ls:类似ls -l的形式,既显示每一个文件的详细信息
其他的处理动作如:
-ok COMMAND {} \; :-ok后面跟平时执行的命令,如果后有文件,则用{}表示文件名称占位符,最后必须以\;结束。否则会被认为是语法错误,-ok命令每一个操作都需要用户去确认,这是与-exec不同的地方。
-exec COMMAND {} \; 用法同-ok一样,只是不用询问用户
找到类型是目录的文件,并且让此文件属主属组都有执行权限
# find ./ -type d -ok chmod +x {} \; 注意:这里的{}就代表被查找到的文件名
找到文件权限包含020的所有文件,并且把这些文件重命名为“原来的名字后跟.new”
# find ./ -perm -020 -exec mv {} {}.new \;
练习
1,查找/var目录下属主为root并且属组为mail的所有文件:
find /var -user root -a -group mail
2、查找/usr目录下不属于root,bin,或student的文件;
find /usr -not -user root -a -not -user bin -a -user student
3查找/etc目录下最近一周内内容修改过且不属于root及student用户的文件;
find /etc -mtime -7 -a -not -user root -a -not -user student find /etc -mtime -7 -not\( -user root -o -not -user student\)
4查找当前系统上没有属主或属组且最近1天内曾被访问过的文件,并将其属主属组均修改为root
find / \(-nouser -o -nogroup\) -a -atime -1 -exec chown root:root {} \;
5查找/etc目录下大于1M的文件,并将其文件名写入/tmp/etc.largefiles文件中
find /etc -size +1M >> /tmp/etc.largefiles
6查找/etc目录下所有用户都没有写权限的文件,显示出其详细信息;
find /etc -not -perm /222 -exec ls -l \;