文件查找
文件查找命令locate和find
locate
- 文件查找:在文件系统上查找符合条件的文件
- 非精确非实时查找,查找时依赖于/var/lib/mlocate/mlocate.db数据库
- 依赖于事先构建的索引
索引的构建是在系统较为空闲时自动进行(周期性任务),管理员手动更新数据库(updatedb) - 索引过程需要遍历整个根文件系统,极其消耗资源
- 工作特点:
查找速度快
模糊查找
非实时查找
搜索的是文件的全路径,不仅仅是文件名
可能只搜索用户具备读和执行权限的目录
注意:查找时注意用户权限 - locate - 根据文件名查找文件(外部命令)
- locate - Usage: locate [OPTION]… [PATTERN]…
- 常见选项:
-i:忽略大小搜索
-n #:只列出前面#个匹配的文件
-r:使用基本正则表达式
示例:
1、搜索名称或路径中带有“conf”的文件
[root@centos6 ~]#locate -in3 Conf
/boot/config-2.6.32-754.el6.x86_64
/boot/grub/grub.conf
/etc/Trolltech.conf
2、使用Regex来搜索以“.conf”结尾的文件
[root@centos6 ~]#locate -n3 -r "\.conf$"
/boot/grub/grub.conf
/etc/Trolltech.conf
/etc/asound.conf
find命令
- 实时查找工具,通过遍历指定路径完成文件的查找
- find 命令的工作特点:
①实时查找
②精确查找
③查找速度略慢
④ 查找时会增加磁盘的读取压力
⑤可能只搜索用户具备读和执行权限的目录
注意:查找时注意用户权限 - find - 查找文件(外部命令)
- Usage:find [选项] [搜索路径] [查找条件] [处理动作]
①搜索路径:指明具体的搜索路径,默认是当前目录
②查找条件:指定查找文件的标准
③处理动作:对符合条件的文件执行操作,默认打印至当前终端 - find 的查找条件有:
①从文件元数据查询:类型,权限,大小,时间,属主,属主
②从文件夹属性查询:文件名称,查询文件的深度(find默认递归查找) - find查找详解
1)常用选项:
-H:
-L:
-P:
2)搜索路径:
默认在当前目录下搜索
3)查找条件:
-name:按名称查找(支持使用glob)
-iname:不区分大小写
-inum #:inode为#的文件
-samefile name:同一文件;指的是相同文件系统 相同inode的文件
-link #:链接数为#的文件
-regex pattern:使用正则表达式匹配文件名
!注意:此处pattern建议双引号引起来;而且find是搜索的是全径,
因此搜索以.conf结尾的文件时表示为'.*\.conf' .*必须存在
-perm:按权限查找
-perm mode:精确权限查找
-perm /mode:表示或者 / | + :但是+从centos7开始淘汰
-perm -mode:表示并且
给定mode时将权限展开:其中表示-的权限代表不关心(精确匹配除外)
eg:(640)rw-r----- ,0表示不关心,即-表示不关心此处权限
具体实例:
-perm 640 表示精确匹配权限位640的文件
-perm -640
此处-640满足条件的a:rw g:r这三个权限均在的文件,其
他权限不关心
-perm +640 此时将权限展开:rw-r-----
此处+640满足条件的a:rw g:r这三个权限中有一个即可的
文件,其他权限不关心
-user:按文件属主查找
-group:按文件属组查找
-uid useUID:按属主为指定的useUID查找
-gid useGID:按属组为指定的useGID查找
-nouser:查找无属主的文件
-nogroup:查找无属组的文件
-size:按文件大小进行查找
-size [+|-] #[K|M|G..] 下面以单位为M举例
# M:表示范围是(#-1M;#M]
- # M:表示范围是(0,#-1M]
+ # M:表示范围是(#M,∞)
!注意:计算时带单位
eg: 50K表示
50K:(49K,50K]
-50K:(0,49K]
+50K:(50K,∞)
按时间查找:time以天为单位,min以分钟为单位,
-atime:
-mtime:
-ctime:
-amin:
-mmin:
-cmin:
时间查找也涉及[+|-]问题,原理同上,直接以天为例
当前时间:2019-8-3 00:00
find命令认为24小时之内为0天
-atime 1:2019-8-2 00:00 - 2019-8-3 00:00
-atime -1:2019-8-3 00:00 - 当前时间
-atime +1:2019-8-2 00:00 以前
-type:按文件类型进行查找
l:符号链接
f:普通文件
b:块设备
c:字符设备
s:套接字
p:管道文件
d:目录
-maxdepth level:指定最大搜索目录深度
-mindepth level:指定最小搜索目录深度
-depth:先处理目录内的文件,再处理目录
查找条件的与或非:
默认find查找多个条件同时写是与的关系:
eg:
find /data -perm /111 -regex '.*\.sh' -type f -ls
组合条件:
与:-a(默认)
或:-o
非: ! -not
摩根定律:
(!A) -o (!B)=!(A -a B)
(!A) -a (!B)=!(A -o B)
find 命令后面添加()时()需要转义:即\( \)
eg:
find /data \( -perm 640 -o -regex '.*\.sh$' \) -ls
4)处理动作:对满足查找条件的文件执行的处理动作
-print:默认的处理动作,打印至当前终端
-ls:类似于ls -l的长格式显示满足查找条件的文件
-delete:删除满足查找条件的文件
-fls file:将满足查找条件的文件的长格式信息保存至指定的file文件中
-ok CMD {} \; 将满足查找条件的文件执行CMD的命令,
默认带--interactive(提示)选项;执行命令会交互让用户确认
--exec CMD {} \; 将满足查找条件的文件执行CMD的命令,不提示
{}:用于引用查找到的文件名
find传递查找到的文件至后面的CMD时,将查找的全部文件名一次性全部传递
xargs命令
- 简述xargs的一般用法,xargs是将STDIN的数据以空格符或者回车传给后面的命令作为参数
- xargs其后面默认带echo命令;即将STDIN的数据以空格符或者回车显示
- 若当命令不支持参数较多时,xargs还可将参数分割,指定参数一个一个传给此命令
- 注意:文件名或者是其他有意义的名词内含有空格,处理比较麻烦
- xargs 常用选项:
-0 --null:输入项由空字符(null)作为终止符,而不是空格
-n max-args:指定一行最多显示几个参数 - 示例
xargs支持STDIN意味着可以使用管道将命令输出传给xargs 然后xargs 把这
些作为参数传给xargs后面的命令
CMD1| xargs CMD2
eg:批量添加用户:useradd默认其后只能跟一个参数,此时可以使用xargs实现
[root@centos7 data]# echo user{1..5}|xargs -n1 useradd
[root@centos7 data]# tail -5 /etc/passwd
wang:x:1003:1005::/home/wang:/bin/bash
user2:x:1004:1006::/home/user2:/bin/bash
user3:x:1005:1007::/home/user3:/bin/bash
user4:x:1006:1008::/home/user4:/bin/bash
user5:x:1007:1009::/home/user5:/bin/bash
[root@centos7 data]# echo user{1..5}|xargs -n1 userdel -r
这样就批量的把五个用户删除啦!
eg:利用xargs实现文件内容转置(有规律的文件默认以空格作为分隔符时可以用xargs)
[root@centos7 test]# cat nameage.txt
tom:18 job:20 jerry:19
[root@centos7 test]# cat nameage.txt | xargs -n1
tom:18
job:20
jerry:19
[root@centos7 test]# cat -A nameage.txt
tom:18^Ijob:20^Ijerry:19$
[root@centos7 test]# cat nameage.txt | xargs -n1| paste -s
tom:18 job:20 jerry:19
[root@centos7 test]#
eg:xargs经常结合find命令使用
[root@centos7 test]# find /data/ -perm /111 -type f | xargs chmod -x
去掉了/data目录下所有具有执行权限的文件