文件的查找
在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