在Linux系统上搜索文件的方法有很多种,有的命令很简单,有的命令很详细。我们的目标:缩小搜索范围并找到您要查找的文件,而不会被其他文件分散注意力。在今天的文章中,我们将研究一些最有用的文件搜索命令和选项。我们将涵盖:快速搜索更复杂的搜索条件条件组合反向条件简单和冗长的响应查找重复文件有许多有用的文件搜索命令,find命令可能是其中最著名的,但它不是唯一的一、查找目标文件也不总是最快的方法。快速搜索命令:which和locate搜索文件的最简单命令可能是which和locate,但两者都有一些局限性。which命令只会在系统定义的搜索路径中寻找可执行文件,通常用于标识命令。如果您对键入which时将运行哪个命令感到好奇,可以使用which将指向相应可执行文件的命令。$which/usr/bin/whichwhich命令显示它找到的同名的第一个可执行文件(即使用该命令时将运行的文件),然后停止。locate命令更慷慨一点,它可以找到任意数量的文件,但它也有一个限制:只有当文件名包含在updatedb命令构建的数据库中时它才有效。该文件可能存储在某处,例如/var/lib/mlocate/mlocate.db,但除locate外,其他任何命令都无法读取它。该文件通常通过cron每天运行的updatedb更新。简单的find命令没有太多限制,但需要指定搜索起点和搜索条件。最简单的查找命令:按文件名搜索文件。像这样:$查找。-namerunme./bin/runme如上所示,除非您指定搜索深度,否则按文件名搜索文件系统的当前位置将搜索所有子目录。不仅仅是文件名find命令允许您搜索文件名以外的各种条件,包括文件所有者、组、权限、大小、修改时间、缺少所有者或组以及文件类型等。除了查找文件之外,您还可以删除文件、重命名文件、更改所有者、更改权限以及对找到的文件运行几乎任何命令。以下两个命令查找:root用户拥有的当前目录中的文件,以及不属于指定用户(在本例中为shs)的文件。在此示例中,两个输出相同,但情况并非总是如此。$找到。-userroot-ls3969260lrwxrwxrwx1rootroot21Sep2109:03./xyz->/home/peanut/xyz$找到.!-usershs-ls3969260lrwxrwxrwx1rootroot21Sep2109:03./xyz->/home/peanut/xyz感叹号!字符代表“不”:反转它后面的条件。以下命令将查找具有特定权限的文件:$find.-perm750-ls3971764-rwxr-x---1shsshs115Sep1413:52./ll3982094-rwxr-x---1shsshs117Sep2108:55./get-updates3971454drwxr-x---2shsshs4096Sep1415:42./newdir下一个命令显示具有777权限的非符号链接文件:$sudofind/home-perm777!-typel-ls3971324-rwxrwxrwx1shsshs18Sep1516:06/home/shs/bin/runme3969494-rwxrwxrwx1rootroot558Sep2111:21/home/oops命令将查找大于的文件千兆字节的大小。请注意,我们发现了一个非常有趣的文件。它以ELF核心文件格式表示系统的物理内存。$sudofind/-size+1G-ls40265319940-r-------1rootroot140737477881856Sep2111:23/proc/kcore144472215332-rw-rw-r--1shsshs1609039872Sep1315:55/home/shs/Downloads/ubuntu-17.04-desktop-amd64.iso只要知道find命令是如何描述文件类型的,就可以按文件类型查找文件。b=块设备文件c=字符设备文件d=目录p=命名管道f=常规文件l=符号链接s=套接字D=门(仅限Solaris)在下面的命令中,我们正在寻找符号链接和套接字:$find.-typel-ls3969260lrwxrwxrwx1rootroot21Sep2109:03./whatever->/home/peanut/whatever$find.-types-ls3952560srwxrwxr-x1shsshs0Sep2108:50./.gnupg/S.gpg-agent您还可以按inode编号搜索文件:$find.-inum397132-ls3971324-rwx------1shsshs18Sep1516:06./bin/runme另一种通过inode搜索文件的方法是使用debugfs命令。在大型文件系统上,此命令可能比find快得多,您可能需要安装icheck。$sudodebugfs-R'ncheck397132'/dev/sda1debugfs1.42.13(17-May-2015)InodePathname397132/home/shs/bin/runme在下面的命令中,我们从主目录(~)开始,限制搜索深度(即我们将搜索多少级子目录),并且只查看在最后一天(mtime设置)内创建或修改的文件。$find~-maxdepth2-mtime-1-ls4079284drwxr-xr-x21shsshs4096Sep2112:03/home/shs3940068-rw------1shsshs5909Sep2108:18/home/shs/.bash_history3996124-rw--------1shsshs53Sep2108:50/home/shs/.Xauthority3996154drwxr-xr-x2shsshs4096Sep2109:32/home/shs/Downloads不只是使用-exec选项列出文件,您可以在使用find命令找到文件后以某种方式更改文件。您只需要参考-exec选项即可运行相应的命令。$找到。-namerunme-execchmod700{}\;$查找.-namerunme-ls3971324-rwx------1shsshs18Sep1516:06./bin/runme在这个命令中,{}代表文件名。此命令将更改当前目录和子目录中任何名为runme的文件的权限。只需将您想运行的任何命令放在-exec选项之后,并使用与上述命令类似的语法。其他搜索条件如上例所示,您还可以通过其他条件进行搜索:文件修改时间、所有者、权限等。下面是一些示例。根据用户查找文件$sudofind/home-userpeanut/home/peanut/home/peanut/.bashrc/home/peanut/.bash_logout/home/peanut/.profile/home/peanut/examples.desktop根据查找文件权限$sudofind/home-perm777/home/shs/whatever/home/oops根据修改时间查找文件$sudofind/home-mtime+100/home/shs/.mozilla/firefox/krsw3giq.default/gmp-gmpopenh264/1.6/gmpopenh264.info/home/shs/.mozilla/firefox/krsw3giq.default/gmp-gmpopenh264/1.6/libgmpopenh264.so通过比较修改时间来查找文件这样的命令将允许您查找最近修改的文件次。$sudofind/var/log-newer/var/log/syslog/var/log/auth.log查找重复文件如果您正在清理磁盘空间,您可能想要删除大的重复文件。确定文件是否真正重复的唯一方法是使用fdupes命令。此命令使用md5校验和来确定文件是否具有相同的内容。使用-r(递归)选项,fdupes将进入一个目录并查找具有相同校验和并被确定为内容相同的文件。如果你以root身份运行这样的命令,你可能会发现很多重复的文件,但其中有很多是在创建时添加到主目录的启动文件。#fdupes-rn/home>/tmp/dups.txt#更多/tmp/dups.txt/home/jdoe/.profile/home/tsmith/.profile/home/peanut/.profile/home/rocket/.profile/home/jdoe/.bashrc/home/tsmith/.bashrc/home/peanut/.bashrc/home/rocket/.bashrc同样,你可能会发现/usr中有很多重复的配置文件,不应该删除。因此,请谨慎使用fdupes的输出。fdupes命令并不总是很快,但请记住它对许多文件运行校验和以进行比较,您可能会意识到它的效率。总结在Linux系统上查找文件的方法有很多种。如果您可以描述您要查找的内容,上面的命令将帮助您找到它。
