Linux文件查找
使用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,输出被丢弃)。
- 根据文件名查找文件
想要根据文件名查找文件,可使用-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 ~]#
- 根据大小查找文件
若磁盘被填满,并且想要找到最大的文件在什么位置,可以按照文件大小搜索系统。其中-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 .
- 根据用户查找文件
当试图查找文件时,可搜索一个特定的所有者(-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用户拥有的文件
- 根据权限查找文件
根据权限搜索文件可在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 匹配目录类型
- 根据日期和时间查找文件
若忘记更改了哪个文件,查看过去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选项参数的数字之前应该添加一个连字符(表示从当前时间到数分钟或者数天前的时间)或者一个加号(表示分钟数或天数之间以及更久的时间)。如果没有使用连字符或者加号,则数字完全匹配。
- 在查找文件时使用‘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
- 查找文件和执行命令
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