文件的查找

在Linux中查找命令有2种locate和find

locate

locate 命令查找的是数据库文件并非实时查找需要updatedb更新数据库文件
命令语法:
locate [OPTION]... PATTERN...

选项 说明
-i 不区分大小写
-n N 只列举前N个匹配项目
-r 使用基本正则表达式

示例

[root@centos7 etc]# locate -n 5 .conf
/etc/GeoIP.conf
/etc/GeoIP.conf.default
/etc/asound.conf
/etc/brltty.conf
/etc/chrony.conf

find

find命令不同于locate是实时查找文件,通过遍历路径来查找文件
命令语法
find [-H] [-L] [-P] [-D debugopts] [-Olevel] [path...] [expression]
常用选项类型
1.根据属主、属组查找:
选项 说明
-user USERNAME 查找属主为指定用户(UID)的文件
-group GRPNAME 查找属组为指定组(GID)的文件
-uid UserID 查找属主为指定的UID号的文件
-gid GroupID 查找属组为指定的GID号的文件
-nouser 查找没有属主的文件
-nogroup 查找没有属组的文件

示例:
查找/var目录下属主为root,且属组为mail的所有文件

[root@centos7 ~]# find /var -user root -group mail -ls
 26050    0 drwxrwxr-x   2 root     mail           31 Mar  5 21:13 /var/spool/mail

2.根据文件类型查找
-type TYPE
f: 普通文件
d: 目录文件
l: 符号链接文件
s:套接字文件
b: 块设备文件
c: 字符设备文件
p: 管道文件
示例:
显⽰/etc下的所有⽬录⽂件

find /etc -typd d
[root@centos7 ~]# find /etc -type d
/etc
/etc/fonts
/etc/fonts/conf.d
/etc/grub.d
/etc/X11
...

3.组合条件:
与:-a
或:-o
非:-not !
示例:
查找/var目录下不属于root、lp、gdm的所有文件

[root@centos7 ~]# find /var -not \( -user root -o -user lp -user gdm \)
/var/tmp/abrt
/var/lib/colord
/var/lib/colord/icc
/var/lib/colord/mapping.db
/var/lib/colord/storage.db
...

4.根据文件大小来查找:
-size [+|-]#UNIT
常用单位:k, M, G,c(byte)
#UNIT: (#-1, #]
如:6k 表示(5k,6k]
-#UNIT:[0,#-1]
如:-6k 表示[0,5k]
+#UNIT:(#,∞)
如:+6k 表示(6k,∞)
示例:
查找/etc目录下大于1M且类型为普通文件的所有文件

[root@centos7 ~]# find /etc -size +1M  -type f
/etc/selinux/targeted/active/policy.kern
/etc/selinux/targeted/contexts/files/file_contexts.bin
/etc/selinux/targeted/policy/policy.31
/etc/udev/hwdb.bin
/etc/brltty/zh-tw.ctb

5.根据时间戳:
以“天”为单位
-atime [+|-]#,
#: [#,#+1)
+#: [#+1,∞]
-#: [0,#)
-mtime
-ctime
以“分钟”为单位
-amin
-mmin
-cmin
示例:
查找当前系统上没有属主或属组,且最近一个周内曾被访问过的文件

[root@centos7 ~]# userdel masuri
[root@centos7 ~]# find / -atime -7 -nouser -nogroup
find: ‘/proc/58064/task/58064/fd/5’: No such file or directory
find: ‘/proc/58064/task/58064/fdinfo/5’: No such file or directory
find: ‘/proc/58064/fd/6’: No such file or directory
find: ‘/proc/58064/fdinfo/6’: No such file or directory
/home/masuri
/home/masuri/.mozilla
/home/masuri/.mozilla/extensions
/home/masuri/.mozilla/plugins

6.根据权限查找:
-perm [/|-]MODE
MODE: 精确权限匹配
/MODE:任何一类(u,g,o)对象的权限中只要能一位匹配即可,或关系,+从centos7开始淘汰
-MODE:每一类对象都必须同时拥有指定权限,与关系
0 表示不关注
示例:
查找/etc目录下所有用户都没有写权限的文件

[root@centos7 ~]# find /etc -not -perm /222 -ls

查找/etc目录下至少有一类用户没有写权限的文件

[root@centos7 ~]# find /etc -not -perm -222 -ls

查找/etc目录下,所有用户都有写行权限的文件

[root@centos7 ~]# find /etc -perm -222 -ls
316079    0 lrwxrwxrwx   1 root     root           20 Mar  5 21:08 /etc/rc.d/rc0.d/K50netconsole -> ../init.d/netconsole
68345130    0 lrwxrwxrwx   1 root     root           17 Mar  5 21:08 /etc/rc.d/rc1.d/K90network -> ../init.d/network
....

查找/etc目录下任何一类用户有写权限的文件

[root@centos7 ~]# find /etc -perm /222 -ls
1100932    8 -rwxr-xr-x   1 root     root         5861 Apr 11  2018 /etc/smartmontools/smartd_warning.sh
135846118    4 -rw-r--r--   1 root     root            1 Oct 31 01:10 /etc/at.deny
202851786    0 drwxr-xr-x   3 root     root           24 Mar  5 21:10 /etc/kernel
1100988    0 drwxr-xr-x   2 root     root           42 Mar  5 21:10 /etc/kernel/postinst.d
1100989    4 -rwxr-xr-x   1 root     root         1676 Nov  3 01:40 /etc/kernel/postinst.d/51-dracut-rescue-postinst.sh

7.处理动作
-print:默认的处理动作,显示至屏幕
-ls:类似于对查找到的文件执行“ls -l”命令
-delete:删除查找到的文件
-fls file:查找到的所有文件的长格式信息保存至指定文件中
-ok COMMAND {} \; 对查找到的每个文件执行由COMMAND指定的命令,对于每个文件执行命令之前,都会交互式要求用户确认
-exec COMMAND {} \; 对查找到的每个文件执行由COMMAND指定的命令
{}: 用于引用查找到的文件名称自身
find传递查找到的文件至后面指定的命令时,查找到所有符合条件的文件一次性传递给后面的命令
示例:
查看当前⽬录下30天以前.log结尾、⼤于1G的⽂件,并把它移动到/tmp下?

find . -ctime +30 -size +1G -name "*.log" -exec mv {} /tmp \;

参数替换xargs
由于很多命令不支持管道|来传递参数,xargs用于产生某个命令的参数,xargs
可以读入 stdin 的数据,并且以空格符或回车符将 stdin 的数据分隔成为参数
许多命令不能接受过多参数,命令执行可能会失败,xargs可以解决
注意:文件名或者是其他意义的名词内含有空格符的情况
find和xargs的组合:find | xargs COMMAND