Linux文件查找

146 阅读6分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。


大家在使用Linux的时候很多时候有很多的服务配置文件,或者是自己创建的文件,这些文件都比较重要但是又会忘记,当我们忘记的时候如何查找到相对于的文件路径呢?本文介绍几种方式

which命令

which指令会在环境变量$PATH设置的目录里查找符合条件的文件。如果读者是小白不理解什么是环境变量那么你就把环境变量理解为固定的一些目录。 通常是当我们需要查找某个命令的路径时可以使用which命令。

例:

 [root@localhost ~]# which poweroff
 /usr/sbin/poweroff

locate命令

locate搜索的速度会比较快,因为需要先将文件目录生成数据库,然后再在数据库中查找,但是是非实时的从数据库里快速搜索文件或目录,如果是第一次下载或者安装可以尝试先更新数据库之后再查找文件。

 [root@localhost ~]# yum -y install mlocate  # 安装locate
 [root@localhost ~]# updatedb    # 更新数据库
 [root@localhost ~]# locate hosts    # 查找hosts文件名的文件
 [root@localhost ~]# locate /etc/sh      # 查找/etc目录下所有以

默认情况下,locate数据库中会忽略某些文件夹,可以在配置文件中修改

 [root@localhost ~]# cat /etc/updatedb.conf 
 PRUNE_BIND_MOUNTS = "yes"
 PRUNEFS = "9p afs anon_inodefs auto autofs bdev binfmt_misc cgroup cifs coda configfs cpuset debugfs devpts ecryptfs exofs fuse fuse.sshfs fusectl gfs gfs2 gpfs hugetlbfs inotifyfs iso9660 jffs2 lustre mqueue ncpfs nfs nfs4 nfsd pipefs proc ramfs rootfs rpc_pipefs securityfs selinuxfs sfs sockfs sysfs tmpfs ubifs udf usbfs ceph fuse.ceph"
 PRUNENAMES = ".git .hg .svn .bzr .arch-ids {arch} CVS"
 PRUNEPATHS = "/afs /media /mnt /net /sfs /tmp /udev /var/cache/ccache /var/lib/yum/yumdb /var/lib/dnf/yumdb /var/spool/cups /var/spool/squid /var/tmp /var/lib/ceph"

find命令

find命令可以说是非常好用的文件查找命令,功能强大,也是阿杰平时爱用的方式。在查找文件的时候可以根据文件的文件名、文件类型、文件大小、文件权限、文件日期等多种条件进行查询。 但是这种方式的查询效率相对来说较低,因为他一般是通过遍历整个文件系统来找到你想要的文件,日常查找还是非常方便实用。

  • 实时查找工具,通过遍历指定路径下的文件系统完成文件查找

  • 工作特点

    • 查找速度略慢
    • 精确查找
    • 实时查找
    • 可以满足多种条件匹配

find查找文件时包括两个核心思想,一个是查找条件,一个是处理动作,查找条件指的是根据什么匹配条件匹配出我们要查找到的文件,处理动作指的是查找到文件之后对该文件进行哪些处理。常用格式如下:

 find [选项] [路径] [查找条件 + 处理动作]
 查找路径:指定具体目录路径,默认是当前文件夹
 查找条件:指定的查找标准(文件名/大小/类型/权限等),默认是找出所有文件
 处理动作:对符合条件的文件做什么操作,默认输出屏幕

查找条件

  • 查找条件
 根据文件名查找:
     ‐name "filename" 支持global
     ‐iname "filename" 忽略大小写
     ‐regex "PATTERN" 以Pattern匹配整个文件路径字符串,而不仅仅是文件名称
 根据属主和属组查找:
     ‐user USERNAME:查找属主为指定用户的文件
     ‐group GROUPNAME:查找属组为指定属组的文件
     ‐uid UserID:查找属主为指定的ID号的文件
     ‐gid GroupID:查找属组为指定的GID号的文件
     ‐nouser:查找没有属主的文件
     ‐nogroup:查找没有属组的文件
 根据文件类型查找:
     ‐type Type:
     f/d/l/s/b/c/p
 根据文件大小来查找:
     ‐size [+|‐]N[bcwkMG]
 根据时间戳:
     天:
         ‐atime [+|‐]N
         ‐mtime
         ‐ctime
     分钟:
         ‐amin N
         ‐cmin N
         ‐mmin N
 根据权限查找:
     ‐perm [+|‐]MODE
     MODE:精确权限匹配
     /MODE:任何一类(u,g,o)对象的权限中只要能一位匹配即可
     ‐MODE:每一类对象都必须同时拥有为其指定的权限标准
 组合条件:
     与:‐a
     或:‐o
     非:‐not
 相关案例:找出/tmp目录下,属主不是root,且文件名不是fstab的文件:
 find /tmp ( ‐not ‐user root ‐a ‐not ‐name 'fstab') ‐ls
  • 根据文件名查找
 [root@localhost ~]# find /etc -name "ifcfg-ens33"
 [root@localhost ~]# find /etc -iname "ifcfg-ens33"  # 忽略大小写
 [root@localhost ~]# find /etc -iname "ifcfg*"
  • 按文件大小
 [root@localhost ~]# find /etc -size +5M # 大于5M
 [root@localhost ~]# find /etc -size 5M  # 等于5M
 [root@localhost ~]# find /etc -size -5M # 小于5M
 [root@localhost ~]# find /etc -size +5M -ls # 找到的处理动作-ls
  • 指定查找的目录深度
 [root@localhost ~]# find / -maxdepth 3 -a -name "ifcfg-ens33"   # 最大查找深度
 # -a是同时满足,-o是或
 [root@localhost ~]# find / -mindepth 3 -a -name "ifcfg-ens33"   # 最小查找深度
  • 按时间找
 [root@localhost ~]# find /etc -mtime +5     # 修改时间超过5天
 [root@localhost ~]# find /etc -mtime 5      # 修改时间等于5天
 [root@localhost ~]# find /etc -mtime -5     # 修改时间5天以内
  • 按照文件属主、属组找
 [root@localhost ~]# find /home -user xwz    # 属主是xwz的文件
 [root@localhost ~]# find /home -group xwz
 [root@localhost ~]# find /home -user xwz -group xwz
 [root@localhost ~]# find /home -user xwz -a -group root
 [root@localhost ~]# find /home -user xwz -o -group root
 [root@localhost ~]# find /home -nouser      # 没有属主的文件
 [root@localhost ~]# find /home -nogroup     # 没有属组的文件
  • 按文件类型
 [root@localhost ~]# find /dev -type d 
  • 按文件权限
 [root@localhost ~]# find / -perm 644 -ls
 [root@localhost ~]# find / -perm -644 -ls   # 权限小于644的
 [root@localhost ~]# find / -perm 4000 -ls
 [root@localhost ~]# find / -perm -4000 -ls
  • 按正则表达式
 [root@localhost ~]# find /etc -regex '.*ifcfg-ens[0-9][0-9]'
 # .*    任意多个字符
 # [0-9] 任意一个数字
  • 条件组合
 -a:多个条件and并列
 -o:多个条件or并列
 -not:条件取反

处理动作

 ‐print:默认的处理动作,显示至屏幕
 ‐ls:类型于对查找到的文件执行“ls ‐l”命令
 ‐delete:删除查找到的文件
 ‐fls /path/to/somefile:查找到的所有文件的长格式信息保存至指定文件中
 ‐ok COMMAND {}\:对查找到的每个文件执行由COMMAND指定的命令
 对于每个文件执行命令之前,都会交换式要求用户确认
 ‐exec COMMAND {} \:对查找到的每个文件执行由COMMAND指定的命令
 [root@server1 ~]# find /etc/init.d/ -perm -111 -exec cp -r {} dir1/ ;
 {}:用于引用查找到的文件名称自身
 注意:find传递查找到的文件至后面指定的命令时,查找到所有符合条件的文件一次性传递给后面的命令;另一种方式可规避此问题
 find | xargs COMMAND