Linux文件查找

为帮助找到系统中的文件,可使用locate(根据名称查找命令)、find(根据不同的属性查找文件)以及grep(在文本文件内部搜索包含搜索文本的行)的命令。

使用locate命令根据名称查找文件

在大多数Linux系统上(包括Fedora和RHEL),每天会运行一次updatedb命令,收集Linux系统中的文件并存入一个数据库中。通过运行locate命令,可以搜索该数据库并找到数据库中所存储的文件位置。

在使用locate命令搜索文件时应注意以下几点:

  • 相对于find命令,Locate命令查找文件的速度更快,因为它搜索的是一个数据库而非整个文件系统。缺点是locate命令无法查找自上一次数据库创建以来新添加到系统中的任何文件。
  • 并不是文件系统中的所有文件都存储到数据库中。通过选择挂载类型、文件类型、文件系统类型以及挂载点,/etc/updated.conf文件的内容限制了被收集的文件名。例如,来自远程挂载的文件系统(cifs、nfs等)以及本地挂载的CD或DVD(iso9660)中的文件名就不会存入数据库。包含临时文件(/tmp)以及假脱机文件(/var/spool/cups)的路径也会被删除。
[root@fedora32 ~]# locate .bashrc

/etc/skel/.bashrc

/home/vagrant/.bashrc

/root/.bashrc

[root@fedora32 ~]# locate -i bashrc #-I 忽略大小写

/etc/bashrc

/etc/skel/.bashrc

/home/vagrant/.bashrc

/root/.bashrc

使用find命令搜索文件

Find命令是在文件系统中搜索文件的最佳命令,可以基于不同的属性进行查找。找到文件之后,可以通过运行任何所需的命令处理这些文件(使用-exec或-okay选项)。

作为普通用户,若对想要搜索的文件系统(如/etc目录)范围内所包含的文件没有完全访问权限,那么当使用find命令时会接收到许多错误信息。为摆脱这些信息,需要将标准错误定向到/dev/null。为此,在命令行的末尾添加以下代码:2 > /dev/null。其中2>将标准错误(STDERR)重定向到后面的选项(此时为/dev/null,输出被丢弃)。

  1. 根据文件名查找文件

想要根据文件名查找文件,可使用-name或-iname选项,为使搜索更加灵活的,可以使用文件匹配字符,如星号(*)和问号(?)。

[root@fedora32 ~]# find /etc -name passwd

/etc/passwd

/etc/pam.d/passwd

[root@fedora32 ~]# find /etc -iname '*passwd*' #-iname 匹配大小写的任意组合

/etc/passwd

/etc/passwd-

/etc/security/opasswd

/etc/pam.d/passwd

[root@fedora32 ~]#
  1. 根据大小查找文件

若磁盘被填满,并且想要找到最大的文件在什么位置,可以按照文件大小搜索系统。其中-size选项能够搜索大于或者小于给定大小的文件。

[root@fedora32 ~]# find /usr/share/ -size +10M #查找大于10M的文件

/usr/share/GeoIP/GeoLite2-City.mmdb

[root@fedora32 ~]# find /usr/share/ -size -1M | ls -lh #查找小于1M的文件

total 16K

-rw-r--r--. 1 root root 6.1K Nov 30 12:57 chmodbak

-rw-------. 1 root root 2.0K Nov 2 07:31 original-ks.cfg

-rw-r--r--. 1 root root 1.4K Dec 2 12:38 passwdbak

[root@fedora32 ~]# find . -size +10M | du -lh #du 查看文件大小

0 ./.emacs.d/auto-save-list

0 ./.emacs.d

56K .
  1. 根据用户查找文件

当试图查找文件时,可搜索一个特定的所有者(-user)或组(-group)。通过使用-not和-or,可以优化对与特定用户和组相关联文件的搜索。

[root@fedora32 ~]# find /home -user vagrant -ls

#输出/home目录中vagrant拥有的所有文件的列表

135391061 0 drwx------ 3 vagrant vagrant 95 Nov 27 02:20 /home/vagrant

135391062 4 -rw-r--r-- 1 vagrant vagrant 18 Jan 28 2020 /home/vagrant/.bash_logout

135391063 4 -rw-r--r-- 1 vagrant vagrant 141 Jan 28 2020 /home/vagrant/.bash_profile

[root@fedora32 ~]# find /home \( -user vagrant -or -user root \) -ls

#输出由vagrant或root拥有的文件

135172675 0 drwxr-xr-x 3 root root 21 Nov 2 07:29 /home

135391061 0 drwx------ 3 vagrant vagrant 95 Nov 27 02:20 /home/vagrant

135391062 4 -rw-r--r-- 1 vagrant vagrant 18 Jan 28 2020 /home/vagrant/.bash_logout

135391063 4 -rw-r--r-- 1 vagrant vagrant 141 Jan 28 2020 /home/vagrant/.bash_profile

[root@fedora32 ~]# find /etc -group date -ls #找出所有以ntp作为主要组的文件

[root@fedora32 ~]# find /var/spool -not -user root -ls #显示目录下所有不被root用户拥有的文件
  1. 根据权限查找文件

根据权限搜索文件可在find命令中使用-perm选项,根据数字或字母找到文件。在数字前使用一个连字符(-),那么所有三位都必须匹配;使用加号(+),那么任何一个数字都可以与搜索匹配,从而找到一个文件。若连字符和加号都不使用,那么所有数字必须完整、精确匹配。

[root@fedora32 ~]# find /usr/bin -perm 755 -ls

201427240 48 -rwxr-xr-x 1 root root 46584 Feb 2 2021 /usr/bin/cat

201328944 40 -rwxr-xr-x 1 root root 40600 Feb 3 2021 /usr/bin/getconf

[root@fedora32 ~]# find /usr -perm 755 -type d -ls | less #-type d 匹配目录类型
  1. 根据日期和时间查找文件
若忘记更改了哪个文件,查看过去10分钟内哪些内容被修改了:

[root@fedora32 ~]# find /etc/ -mmin -10

查看过去3天内是否有任何命令的所有权和权限被修改,或谁登录电脑:

[root@fedora32 ~]# find /bin /usr/bin /sbin /usr/sbin -ctime -3

从FTP服务器(/var/ftp)和web服务器(/var/www)中查找300多天没有访问过的文件,从而可以查看是否需要删除:

[root@fedora32 ~]# find /var/ftp -atime +300

Time选项(-atime、-ctime和-mtime)能够基于自文件被访问、更改或者文件的元数据被更改以来所经历的天数进行搜索。而min选项(-amin、-cmin和-mmin)则是基于所经历的分钟数进行搜索。

在作为min或time选项参数的数字之前应该添加一个连字符(表示从当前时间到数分钟或者数天前的时间)或者一个加号(表示分钟数或天数之间以及更久的时间)。如果没有使用连字符或者加号,则数字完全匹配。

  1. 在查找文件时使用‘not’和’or‘
    [root@fedora32 ~]# find /var/ -user vagrant -not -group root -ls
    
    #搜索被用户vagrant所拥有却没有被分配给组root的文件
    
    201326726 0 -rw-rw---- 1 vagrant mail 0 Nov 2 07:29 /var/spool/mail/vagrant
    
    [root@fedora32 ~]# find /var/ -user vagrant -and -size +1M -ls #可在搜索中添加多个需求,例一个文件必须被用户vagrant所拥有,同时文件大小必须大于1M
  1. 查找文件和执行命令

Find命令的一个最强大的功能是能够在找到的任何文件上执行命令。使用-exec和-ok的语法:

[root@fedora32 ~]# find [options] -exec command {} \;

[root@fedora32 ~]# find [options] -ok command {} \;

通过使用-exec选项,可以在每一个找到的文件上执行命令,而不必停下来询问是否执行。

使用-ok选项则会在每个匹配的文件上停留,并询问是否想要在该文件上执行命令。使用-ok选项的好处是如果对文件进行了一些破坏操作,那么在执行命令之前可以确认每个文件完好。

可以运行带有任何选项的find命令,找到所需的文件。然后输入-exec或者-ok选项,并紧跟想要在每个文件上运行的命令。一组大括号表示前面的find查找出来的文件名。若需要,每个文件可以在命令行中被多次包含。在命令行末尾,需要添加一个反斜杠和分号(\;)。

[root@fedora32 ~]# find /etc -iname passwd -exec echo "I found {}" \;

I found /etc/passwd

I found /etc/pam.d/passwd

[root@fedora32 ~]# find /etc -size +2M -exec du {} \; | sort -nr # sort -nr 按照文件大小从大到小的顺序存储find的输出

10308 /etc/udev/hwdb.bin

7884 /etc/selinux/targeted/policy/policy.32

使用-ok选项,在将找到的每个文件复制到/tmp/目录之前会对用户进行提示。只需要在每一行输入“y”或“n”并单击Enter键就可以决定是否复制文件,或直接单击Enter键跳过。

[root@fedora32 ~]# find /etc/ -user vagrant -ok -cp {} /tmp/ \;

< -cp ... /etc/sysconfig/network-scripts/ifcfg-eth1 > ? n

使用grep命令在文本中搜索

[root@fedora32 ~]# grep vagrant passwdbak

#使用grep命令在passwdbak文件中查找单词vagrant

vagrant:x:1000:1000::/home/vagrant:/bin/bash

[root@fedora32 ~]# grep -i vagrant passwdbak #-i 不区分大小写

vagrant:x:1000:1000::/home/vagrant:/bin/bash

[root@fedora32 ~]# grep -vi vagrant passwdbak

#-v 查找不包含所指定文本字符的行

root:x:0:0:root:/root:/bin/bash

bin:x:1:1:bin:/bin:/sbin/nologin

#为了进行递归搜索,可以使用-r选项和一个目录作为参数

[root@fedora32 sbin]# grep -rli etc .

#-l 仅显示包含搜索文本的文件而不显示实际的文本行

./zic

./ldconfig

./getcap

./getpcaps

[root@fedora32 ~]# grep -ri --color vagrant passwdbak #-color 默认以红色标识

vagrant:x:1000:1000::/home/vagrant:/bin/bash

[root@fedora32 ~]# ip addr show | grep inet #使用ip命令输出了包括字符串inet的ip地址

#在命令的输出中搜索某一文本,可将该输出发送到grep命令。

inet 127.0.0.1/8 scope host lo
posted @ 2023-12-11 19:14  飔鬏  阅读(27)  评论(0编辑  收藏  举报