linux学习24 Linux运维必备技能-文件查找命令企业级应用
一、文件查找
1、在文件系统上查找符合条件的文件
实现工具:locate,find
2、locate
a、依赖于事先构建好的索引库;
系统自动实现(周期性任务)
手动更新数据库(updatedb),此操作非常消耗系统资源
b、工作特性
查找速度快
模糊查找
非实时查找
c、相应参数
-b:只匹配路径中的基名,不包含路径
-c:统计出共有多少个符合条件的文件
-r:BRE
3、find
a、实时查找工具,通过遍历指定起始路径下文件系统层级结构完成文件查找
b、工作特性
查找速度略慢
精确查找
实时查找
c、用法
find [OPTIONS] [查找起始路径] [查找条件] [处理动作]
查找起始路径:指定具体搜索目标起始路径,默认为当前目录
查找条件:指定的查找标准,可以根据文件名,大小,类型,从属关系,权限等等标准进行;默认为找出指定路径下的所有文件;
处理动作:对符合查找条件的文件作出的操作,例如删除等操作,默认为输出至标准输出
d、查找条件
表达式:选项和测试
测试:
(1)、根据文件名查找:
-name "pattern"
[root@node1 ~]# find /etc -name "passwd" /etc/passwd /etc/pam.d/passwd
-iname "pattern" :忽略名称中的大小写
[root@node1 ~]# find /etc -iname "passwd" /etc/passwd /etc/pam.d/passwd /etc/test/Passwd
支持glob风格的通配符:*,?,[],[^]
[root@node1 ~]# find /etc -iname "passwd*" /etc/passwd /etc/pam.d/passwd /etc/passwd- /etc/test/Passwd /etc/test/passWD.txt
-regex pattern:基于正则表达式模式查找文件,匹配是整个路径,而非基名(一般很少用)
(2)、根据文件从属关系查找:
-user USERNAME:查找属主为指定用户的所有文件
[root@node1 ~]# find /tmp -user moosefs /tmp/moosefs /tmp/moosefs/.bash_logout /tmp/moosefs/.bash_profile /tmp/moosefs/.bashrc /tmp/skel /tmp/skel/.bash_logout /tmp/skel/.bash_profile /tmp/skel/.bashrc [root@node1 ~]# find /tmp -user archlinux
-group GRPNAME:查找属组为指定用户的所有文件
-uid UID:查找属主为指定UID的所有文件;
-gid GID:查找属组为指定的GID的所有文件;
-nouser:查找没有属主的文件
-nogroup:查找没有属组的文件
(3)、根据文件的类型查找
-type TYPE:
f:普通文件
d:目录文件
l:符号链接文件
b:块设备文件
c:字符设备文件
p:管道文件
s:套接字文件
查找/dev目录下所有的块设备文件并查看
[root@node1 ~]# find /dev -type b -ls 10599 0 brw-rw---- 1 root disk 253, 1 Dec 19 18:39 /dev/dm-1 10548 0 brw-rw---- 1 root disk 253, 0 Dec 19 18:39 /dev/dm-0 10451 0 brw-rw---- 1 root cdrom 11, 0 Dec 19 18:39 /dev/sr0 10369 0 brw-rw---- 1 root disk 8, 2 Dec 19 18:39 /dev/sda2 10368 0 brw-rw---- 1 root disk 8, 1 Dec 19 18:39 /dev/sda1 10367 0 brw-rw---- 1 root disk 8, 0 Dec 19 18:39 /dev/sda
(4)、组合测试
与:-a,默认也是与
或:-o,但凡是
[root@node1 ~]# find /tmp -nouser -o -type f -ls #只要符合二者之一即可 35697252 4 -rw-r--r-- 1 moosefs moosefs 18 Aug 3 2017 /tmp/moosefs/.bash_logout 35697253 4 -rw-r--r-- 1 moosefs moosefs 193 Aug 3 2017 /tmp/moosefs/.bash_profile 35697254 4 -rw-r--r-- 1 moosefs moosefs 231 Aug 3 2017 /tmp/moosefs/.bashrc 35697261 4 -rw-r--r-- 1 moosefs moosefs 18 Dec 20 16:47 /tmp/skel/.bash_logout 35697262 4 -rw-r--r-- 1 moosefs moosefs 193 Dec 20 16:47 /tmp/skel/.bash_profile 35697263 4 -rw-r--r-- 1 moosefs moosefs 231 Dec 20 16:47 /tmp/skel/.bashrc 17396129 4 -rw-r--r-- 1 root root 2055 Dec 23 15:43 /tmp/test.etc 16784826 20 -rw-r--r-- 1 root root 17500 Dec 25 15:36 /tmp/function.txt 17790829 8 -rw-r--r-- 1 root root 4253 Dec 26 09:59 /tmp/grub2.cfg 18336343 20 -rw-r--r-- 1 root root 17500 Dec 26 10:03 /tmp/functions [root@node1 ~]# find /tmp -nouser -a -type f -ls [root@node1 ~]#
非:-not,!
[root@node1 ~]# find /tmp -nouser -not -type f -ls [root@node1 ~]#
e、练习
(1)、找出/tmp目录下属主为非root的所有文件
[root@node1 ~]# find /tmp/ -not -user root -ls 35697251 0 drwx------ 2 moosefs moosefs 62 Dec 19 20:43 /tmp/moosefs 35697252 4 -rw-r--r-- 1 moosefs moosefs 18 Aug 3 2017 /tmp/moosefs/.bash_logout 35697253 4 -rw-r--r-- 1 moosefs moosefs 193 Aug 3 2017 /tmp/moosefs/.bash_profile 35697254 4 -rw-r--r-- 1 moosefs moosefs 231 Aug 3 2017 /tmp/moosefs/.bashrc 35697260 0 drwxr-xr-x 2 moosefs moosefs 62 Dec 20 16:47 /tmp/skel 35697261 4 -rw-r--r-- 1 moosefs moosefs 18 Dec 20 16:47 /tmp/skel/.bash_logout 35697262 4 -rw-r--r-- 1 moosefs moosefs 193 Dec 20 16:47 /tmp/skel/.bash_profile 35697263 4 -rw-r--r-- 1 moosefs moosefs 231 Dec 20 16:47 /tmp/skel/.bashrc
(2)、找出/tmp目录下文件名中不包含fstab字符串的文件
[root@node1 ~]# find /tmp -not -iname "*fstab*" -ls
(3)、找出/tmp目录下属主为非root,而且文件名不包含fstab字符串的文件
[root@node1 ~]# find /tmp -not -user root -a -not -iname "*fstab*" -ls 35697251 0 drwx------ 2 moosefs moosefs 62 Dec 19 20:43 /tmp/moosefs 35697252 4 -rw-r--r-- 1 moosefs moosefs 18 Aug 3 2017 /tmp/moosefs/.bash_logout 35697253 4 -rw-r--r-- 1 moosefs moosefs 193 Aug 3 2017 /tmp/moosefs/.bash_profile 35697254 4 -rw-r--r-- 1 moosefs moosefs 231 Aug 3 2017 /tmp/moosefs/.bashrc 35697260 0 drwxr-xr-x 2 moosefs moosefs 62 Dec 20 16:47 /tmp/skel 35697261 4 -rw-r--r-- 1 moosefs moosefs 18 Dec 20 16:47 /tmp/skel/.bash_logout 35697262 4 -rw-r--r-- 1 moosefs moosefs 193 Dec 20 16:47 /tmp/skel/.bash_profile 35697263 4 -rw-r--r-- 1 moosefs moosefs 231 Dec 20 16:47 /tmp/skel/.bashrc
[root@node1 ~]# find /tmp -not \( -user root -o -iname "*fstab*" \) -ls 35697251 0 drwx------ 2 moosefs moosefs 62 Dec 19 20:43 /tmp/moosefs 35697252 4 -rw-r--r-- 1 moosefs moosefs 18 Aug 3 2017 /tmp/moosefs/.bash_logout 35697253 4 -rw-r--r-- 1 moosefs moosefs 193 Aug 3 2017 /tmp/moosefs/.bash_profile 35697254 4 -rw-r--r-- 1 moosefs moosefs 231 Aug 3 2017 /tmp/moosefs/.bashrc 35697260 0 drwxr-xr-x 2 moosefs moosefs 62 Dec 20 16:47 /tmp/skel 35697261 4 -rw-r--r-- 1 moosefs moosefs 18 Dec 20 16:47 /tmp/skel/.bash_logout 35697262 4 -rw-r--r-- 1 moosefs moosefs 193 Dec 20 16:47 /tmp/skel/.bash_profile 35697263 4 -rw-r--r-- 1 moosefs moosefs 231 Dec 20 16:47 /tmp/skel/.bashrc
f、根据文件的大小查找
-size [+|-]#UNIT
常用单位:k,M,G
#UNIT:(#-1,#]相当于值可以小于#一点,也可以等于#,但是要大于#-1
-#UNIT:[0,#-1]相当于值在0到#-1之间,也可以为#-1
[root@node1 ~]# find /tmp/ -size 45k #等于45k的,这个在44k-45k之间,但是不包括44k,可以包括45k /tmp/messages /tmp/messages.2 [root@node1 ~]# find /tmp/ -size -45k #小于45k的,但是不包括44k-45k之间,如果等于44k也可以匹配到 /tmp/ /tmp/.Test-unix /tmp/.font-unix /tmp/.ICE-unix /tmp/.X11-unix /tmp/.XIM-unix
+#UNIT:(#,oo) 。相当于值需要大于#的
[root@node1 ~]# find /tmp/ -size +45k [root@node1 ~]# find /tmp/ -size +44k /tmp/messages /tmp/messages.2 [root@node1 ~]# find /tmp/ -size -44k /tmp/ /tmp/.Test-unix /tmp/.font-unix /tmp/.ICE-unix /tmp/.X11-unix /tmp/.XIM-unix [root@node1 ~]# find /tmp/ -size 44k [root@node1 ~]# find /tmp/ -size -45k /tmp/ /tmp/.Test-unix /tmp/.font-unix /tmp/.ICE-unix /tmp/.X11-unix /tmp/.XIM-unix [root@node1 ~]# find /tmp/ -size 45k /tmp/messages /tmp/messages.2
g、根据时间戳查找
以天为单位
-atime [+|-]# :(访问时间)
#:[#,#-1) ,假如是刚好3天访问,那么就是大于等于三天并且小于四天。如果是三天外访问,那么就是等于四天或四天以上
-#:(#,0:]:假如是三天内就表示小于三天或等于0天
+#:(oo,#-1]:假如是三天外就表示大于等于4天
-mtime :(修改时间)
-ctime (改变时间)
查找/etc目录下至少7天没有访问过的文件
[root@node1 ~]# find /etc/ -atime +7
查找/etc目录下一天没有访问过的文件
[root@node1 ~]# find /etc/ -atime -1
以分钟为单位
-amin
-mmin
-cmin
h、根据权限查找
-perm [/|-] mode
mode:精确权限匹配
查找/etc目录下权限为644的文件
[root@node1 test]# find /etc/test/ -perm 644 -ls 2617990 0 -rw-r--r-- 1 root root 0 Dec 26 15:02 /etc/test/Passwd 2617991 0 -rw-r--r-- 1 root root 0 Dec 26 15:08 /etc/test/passWD.txt
/mode:任何一类用户(u,g,o)的权限中的任何一位(r,w,x)符合条件即满足。即9位权限之间存在"或关系"
查找至少有一类用户有写权限的文件
[root@localhost ~]# find /tmp -perm /222 -ls 33554504 0 drwxrwxrwt 7 root root 182 Dec 28 05:42 /tmp 33881475 0 drwxrwxrwt 2 root root 6 Oct 24 2018 /tmp/.X11-unix 67477957 0 drwxrwxrwt 2 root root 6 Oct 24 2018 /tmp/.XIM-unix 100884653 0 drwxrwxrwt 2 root root 6 Oct 24 2018 /tmp/.Test-unix 33881477 0 drwxrwxrwt 2 root root 6 Oct 24 2018 /tmp/.font-unix 67477958 0 drwxrwxrwt 2 root root 6 Oct 24 2018 /tmp/.ICE-unix 33554505 4 -rw-r--r-- 1 root root 23 Dec 17 05:26 /tmp/issue.tee 33557895 4 -rw-r----- 1 archlinux mygrp 511 Dec 21 18:01 /tmp/inittab 33557896 0 -rw------- 1 root root 0 Dec 21 18:07 /tmp/mytmp.bK3U 33557902 0 -rw------- 1 root root 0 Dec 21 18:08 /tmp/mytmp.XkTnt 33557903 0 -rw------- 1 root root 0 Dec 21 18:08 /tmp/mytmp.HwcI
-mode:每一类用户(u,g,o)的权限中的每一位(r,w,x)同时符合条件即满足。9位权限之间是与关系。
查找三类用户都有写权限的文件
[root@localhost ~]# find /tmp -perm -222 -ls 33554504 0 drwxrwxrwt 7 root root 182 Dec 28 05:42 /tmp 33881475 0 drwxrwxrwt 2 root root 6 Oct 24 2018 /tmp/.X11-unix 67477957 0 drwxrwxrwt 2 root root 6 Oct 24 2018 /tmp/.XIM-unix 100884653 0 drwxrwxrwt 2 root root 6 Oct 24 2018 /tmp/.Test-unix 33881477 0 drwxrwxrwt 2 root root 6 Oct 24 2018 /tmp/.font-unix 67477958 0 drwxrwxrwt 2 root root 6 Oct 24 2018 /tmp/.ICE-unix
i、处理动作
-print:输出至标准输出;默认的动作
-ls:类似于对查找到的文件执行ls -l命令,输出文件的详细信息
-delete:删除查找到的文件
-fls /PATH/TO/SOMEFILE:把查找到的所有文件的长格式信息保存至指定文件中
-ok COMMAND {} \; 这是固定格式,表示对查找到的每个文件执行由COMMAND表示的命令;每次操作都由用户确认
我们查找没有属主的文件并将其属主改为root
[root@localhost /]# find /etc/test -nouser -a -nogroup -ls 67147409 0 -rw-r--r-- 1 1001 1001 0 Dec 28 05:57 /etc/test/a 67147410 0 -rw-r--r-- 1 1001 1001 0 Dec 28 05:57 /etc/test/b 67147411 0 -rw-r--r-- 1 1001 1001 0 Dec 28 05:57 /etc/test/c [root@localhost /]# find /etc/test -nouser -a -nogroup -ok chown root:root {} \; < chown ... /etc/test/a > ? y < chown ... /etc/test/b > ? y < chown ... /etc/test/c > ? y
-exec COMMAND {} \; 这是固定格式,表示对查到的每个文件执行由COMMAND表示的命令,每次操作不需要用户确认。
我们找/etc/test目录下其它用户有写权限的文件并给其改名为文件名.danger
[root@localhost /]# find /etc/test/ -perm /002 -exec mv {} {}.danger \;
注意:find传递查找到的文件路径至后面的命令时,是先查找出所有符合条件的路径,并一次性传递给后面的命令。但是有些命令不能接受过长的参数,此时命令执行会失败。另一种方式可规避此问题:
find |xargs COMMAND
4、课外作业:学习xargs命令的用法
二、练习
1、查找/var目录下属主为root且属组为mail的所有文件或目录
[root@localhost /]# find /var -user root -a -group mail -ls 38568 0 drwxrwxr-x 2 root mail 48 Dec 28 05:58 /var/spool/mail
2、查找/usr目录下不属于root,bin或hadoop的所有文件或目录;用两种方法、、
[root@localhost /]# useradd hadoop [root@localhost /]# find /usr -not -user root -a -not -user bin -a -not -user hadoop -ls 33881482 0 drwx------ 2 polkitd root 6 Apr 11 2018 /usr/share/polkit-1/rules.d 750324 16 -rwsr-sr-x 1 abrt abrt 15432 Apr 27 2018 /usr/libexec/abrt-action-install-debuginfo-to-abrt-cache
[root@localhost /]# find /usr -not \( -user root -o -user bin -o -user hadoop \) -ls 33881482 0 drwx------ 2 polkitd root 6 Apr 11 2018 /usr/share/polkit-1/rules.d 750324 16 -rwsr-sr-x 1 abrt abrt 15432 Apr 27 2018 /usr/libexec/abrt-action-install-debuginfo-to-abrt-cache
3、查找/etc目录下最近一周内其内容修改过,且属主不是root用户也不是hadoop用户的文件或目录
[root@localhost /]# find /etc -mtime -7 -a -not -user root -a -not -user hadoop -ls 67147398 4 -rw-r--r-- 1 fedora fedora 1330 Dec 28 06:25 /etc/test/passwd 67147413 4 -rw-r--r-- 1 archlinux mygrp 1330 Dec 28 06:26 /etc/test/passwdx
[root@localhost /]# find /etc -mtime -7 -a -not \( -user root -o -user hadoop \) -ls 67147398 4 -rw-r--r-- 1 fedora fedora 1330 Dec 28 06:25 /etc/test/passwd 67147413 4 -rw-r--r-- 1 archlinux mygrp 1330 Dec 28 06:26 /etc/test/passwdx
4、查找当前系统上没有属主或属组,且最近一周内曾被访问过的文件或目录。(如果加了或条件后面要跟 -ls的话需要加括号,否则只有-o后面一部分会被ls)
[root@localhost /]# find / \( -nouser -o -nogroup \) -atime -7 -ls 67147398 4 -rw-r--r-- 1 1004 1005 1330 Dec 28 06:25 /etc/test/passwd
5、查找/etc目录下大于1M且类型为普通文件的所有文件
[root@localhost /]# find /etc -size +1M -ls 101020613 3664 -rw------- 1 root root 3750215 Apr 12 2018 /etc/selinux/targeted/active/policy.kern 67545879 1328 -rw-r--r-- 1 root root 1357405 Apr 12 2018 /etc/selinux/targeted/contexts/files/file_contexts.bin 33988106 3664 -rw-r--r-- 1 root root 3750215 Apr 12 2018 /etc/selinux/targeted/policy/policy.31 67146832 7600 -r--r--r-- 1 root root 7780559 Oct 24 2018 /etc/udev/hwdb.bin
[root@localhost /]# find /etc -size +1M -type f -exec ls -lh {} \; -rw-------. 1 root root 3.6M Apr 12 2018 /etc/selinux/targeted/active/policy.kern -rw-r--r--. 1 root root 1.3M Apr 12 2018 /etc/selinux/targeted/contexts/files/file_contexts.bin -rw-r--r--. 1 root root 3.6M Apr 12 2018 /etc/selinux/targeted/policy/policy.31 -r--r--r--. 1 root root 7.5M Oct 24 2018 /etc/udev/hwdb.bin
6、查找/etc目录下所有用户都没有写权限的文件
[root@localhost /]# find /etc -not -perm /222 -type f -exec ls -lh {} \;
7、查找/etc目录至少有一类用户没有执行权限的文件
[root@localhost /]# find /etc -not -perm -111 -type f -ls
8、查找/etc/init.d目录下,所有用户都有执行权限,且其它用户有写权限的所有文件
[root@localhost /]# find /etc -perm -111 -a -perm -002 -type f -ls
[root@localhost /]# find /etc -perm -113 -ls -type f -ls