7.文件查找
文件查找
在文件系统上查找符合条件的文件
实现工具:locate,find
locate:
特性:依赖于事先构建好的索引库
系统自动实现更新索引库(周期性任务)
手动更新数据库(updatedb)
工作特性:查找速度快,模糊查找(查找不精确),非实时查找
命令格式:locate [OPTION]... PATTERN...
-b:只匹配路径中的基名
-c:统计出共有多少个符合条件的文件
-r:基于基本正则表达式来编写模式
注意:索引构建过程需要遍历整个根文件系统,极消耗资源
find:
工作方式:实时查找工具,通过遍历指定起始路径下文件系统层级结构完成文件查找
工作特点:查找速度略慢,精确查找,实时查找
用法:
find [options] [查找路径] [查找条件] [处理动作]
查找起始路径:指定具体搜索目标起始路径;默认为当前目录
查找条件:指定的查找标准,可以根据文件名、大小、类型、从属关系、权限等等标
准进行;默认为找出指定路径下的所有文件
处理动作:对符合查找条件的文件做出的操作,例如删除等操作,默认为输出至标准输出
查找条件:
表达式:由选项和测试组成
测试的实现:结果通常为布尔型(结果要么为真要么为假)
根据文件名查找
-name "pattern"
-iname "pattern"
支持glob风格的通配符
*,?,[],[^]
-regex "pattern":基于正则表达式模式查找文件,匹配是整个路径,而非其名
根据文件从属关系查找:
-user USERNAME:查找属主为指定用户的所有文件(包含目录)
-group GROUPNAME:查找属组指定组的所有文件(包含目录)
-uid UID:查找属主为指定UID的所有文件(包含目录)
-gid GID:查找属组为指定GID的所有文件(包含目录)
-nouser:查找没有属主的文件
-nogroup:查找没有属组的文件
根据文件类型查找:
-type TYPE:
f:普通文件
d:目录
l:符号链接文件(软连接)
b:块设备文件
c:字符设备文件
p:管道文件
s:套接字文件
组合测试:
与:-a,默认组合逻辑(需要两个条件都满足)
find /tmp/ -nouser -a -type f -ls
或:-o(只要符合二者其一就可以)
非:-not
练习:
1.找出/tmp目录下属主为非root,且文件名包含fstab字符串的文件
find /tmp/ -name "fstab" -type f -not -user root -ls
2.找出/tmp目录下文件名中不包含fstab字符串的文件
find /tmp/ -not -name "fstab" -ls
3.找出/tmp目录下属主为非root,而且文件名不包含fstab字符串的文件
find /tmp/ -not -user root -a -not -name "fstab" -ls
find /tmp/ -not \( -user root -o -name "fstab" \) -ls
!A -a !B = !(A -o B)
!A -o !B = !(A -a B)
根据文件的大小查找:
-size [+ | -]#UNIT(单位)
常用单位:K,M,G
#UNIT:(#-1,#)
-#UNIT:(0,#-1)
+#UNIT:(#,00)
根据时间戳查找:
以“天”为单位
-atime:访问时间 [+ | -]#
-#:表示#天之内访问过的文件
+#:表示#天之外访问过的文件
-mtime:修改时间
-ctime:改变时间
以“分钟”为单位
-amin
-mmin
-cmin
根据权限查找:
-perm [/ | -] mode
mode:精确权限查找
/mode:任何一类用户(u,g,o)的权限中任何一位(r,w,x)
符合条件即满足
9位权限之间存在“或”关系
-mode:每一类用户(u,g,o)的权限中的每一位(r,w,x)同
时符合条件即满足
9位权限之间存在“与”关系
处理动作:
-print:输出至标准输出;默认的动作
-ls:类似于对查找到的文件执行“ls -l”命令,输出文件的详细信息
-delete:删除查找到的文件
-fls /PATH/TO/SOMEFILE:将查找到的所有文件的长格式信息保存
至指定的文件中
-ok (command){} \;:对查找到的每个文件执行由command表
示的命令,每次由用户确认
-exec command {} \;:对查找到的每个文件执行由command表示
的命令
注意:find传递查找到的文件路径至后面的命令时,是先查找出所
有符合条件的文件路径,并一次性传递给后面的命令
但是有些命令不能接受过长的参数,此时命令执行会失败
另一种方式可规避此问题
find | xargs command
课外作业:学习xargs命令的用法
练习:
1.查找/var目录下属主为root,且属组为mall的所有文件或目录
find /var/ -user root -a -group mall
2.查找/usr目录下不属于root,bin或hadoop的所有文件或目录;用两种方法
find /usr/ -not -user root -a -not -user bin -a -not -user hadoop -ls
find /usr/ -not \( -user root -o -user bin -o -user hadoop \)
3.查找/etc目录下最近一周内其内容修改过,且属主不是root用户也不是hadoop
用户的文件或目录
find /etc/ -ctime -7 -not -user root -a -not -user hadoop
4.查找当前系统上没有属主或属组,且最近一周内曾被访问过的文件或目录
find / -nouser -o -nogroup -a -ctime -7
5.查找/etc目录下大于1M且类型为普通文件的所有文件
find /etc/ -size +1M -type f -ls
6.查找/etc目录下所有用户都没有写权限的文件
find /etc/ -not -perm /222 -ls
7.查找/etc目录至少有一类用户没有执行权限的文件
find /etc/ -not -perm -111 -ls
8.查找/etc/init.d目录下,所有用户都有执行权限,且其它用户有写权限的所有文
件
find /etc/init.d/ -perm -111 -a -perm /002
Linux系统上的特殊权限
特殊权限:SUID,SGID,STICKY
安全上下文:
1.进程以某用户的身份运行;进程是发起此进程用户的代理,因此以此用户的身份和权限完成所有操作
2.权限匹配模型:
(1)判断进程的属主,是否为被访问的文件属主,如果是,则应用属主的权限,否则进入第2步
(2)判断进程的属主,是否属于被访问的文件属组;如果是,则应用属组的权限,否则进入第3步
(3)应用other(其它人)的权限
SUID:
默认情况下:用户发起的进程,进程的属主是其发起者,因此,其以发起者的身份在运行
SUID的功用:用户运行某程序时,如果此程序拥有SUID权限,那么程序运行为进程时,其进程的属
主不是发起者,而是程序文件自己的属主
普通文件的SUID权限:
chmod u+ | -s FILE...
展示位置:属主的执行权限位
如果属主原本有执行权限,显示为小写s
否则,显示为大写S
SGID:
功用:当目录属组有写权限,且有SGID权限时,那么所有属于此目录的属组,且以属组身份在
此目录中新建文件或目录时,新文件的属组不是用户的基本组,而是此目录的属组
管理文件的SGID权限:
chmod g+ | -s FILE...
展示位置:属组的执行权限位
如果属组原本有执行权限,显示为小写s
否则,显示为大写S
sticky:
功用:对于属组或全局可写的目录,组内的所有用户或系统上的所有用户对在此目录中都能创
建新文件或删除所有的已有文件;如果为此类目录设置sticky权限,则每个用户能创建新文件,
且只能删除自己的文件
管理文件的sticky权限:
chmod o+ | -t FILE...
展示位置:其它用户的执行权限位
如果其它用户原本有执行权限,显示为小写t
否则,显示为大写T
默认上的/tmp和/var/tmp目录默认均有sticky权限
管理特殊权限的另一方式:
suid sgid sticky 八进制权限
0 0 0 0
0 0 1 1
0 1 0 2
0 1 1 3
1 0 0 4
1 0 1 5
1 1 0 6
1 1 1 7
基于八进制方式赋权时,可于默认的三维八进制数字左侧再加一位八进制数字;
例如:chmod 1777
facl:file access control lists
文件的额外赋权机制:
在原有的u,g,o之外,另一让普通用户能控制赋权给另外的用户或组的赋权机制
getfacl命令:
getfacl FILE...
setfacl命令:
赋权给用户:
setfacl -m u:username:mode FILE...
赋权给组:
setfacl -m g:groupname:mode FILE...
撤销赋权:
setfacl -x u:username FILE...
setfacl -x g:groupname FILE...