介绍

用户在首次使用Linux机器时遇到的一个问题是如何找到他们要查找的文件。

本指南将介绍如何使用恰当命名的find命令。这将帮助您使用各种过滤器和参数在VPS上搜索文件。我们还将简要介绍一下locate命令,该命令可用于以其他方式搜索命令。

按名称查找

搜索文件最明显的方法是按名称。

要按名称查找文件,请键入:

find -name "query"

这将区分大小写,这意味着对“文件”的搜索与对“文件”的搜索不同。

要按名称查找文件,但忽略查询的大小写,请键入:

find -iname "query"

如果要查找所有不符合特定格式的文件,可以将搜索结果改为“ -not”或“!”。如果使用“!”,则必须转义该字符,以便bash不会尝试解释它,然后find才能起作用:

find -not -name "query_to_avoid"

要么

find \! -name "query_to_avoid"

按类型查找

您可以使用“ -type”参数指定要查找的文件的类型。它是这样的:

find -type type_descriptor query

您可以在此处使用一些最常见的描述符来指定文件类型:

  • f:常规文件
  • d:目录
  • l:符号链接
  • c:字符设备
  • b:块设备

例如,如果我们要查找系统上的所有字符设备,则可以发出以下命令:

find / -type c
/dev/parport0
/dev/snd/seq
/dev/snd/timer
/dev/autofs
/dev/cpu/microcode
/dev/vcsa7
/dev/vcs7
/dev/vcsa6
/dev/vcs6
/dev/vcsa5
/dev/vcs5
/dev/vcsa4
. . .

我们可以像这样搜索所有以“ .conf”结尾的文件:

find / -type f -name "*.conf"
/var/lib/ucf/cache/:etc:rsyslog.d:50-default.conf
/usr/share/base-files/nsswitch.conf
/usr/share/initramfs-tools/event-driven/upstart-jobs/mountall.conf
/usr/share/rsyslog/50-default.conf
/usr/share/adduser/adduser.conf
/usr/share/davfs2/davfs2.conf
/usr/share/debconf/debconf.conf
/usr/share/doc/apt-utils/examples/apt-ftparchive.conf
. . .

按时间和大小过滤

查找为您提供了多种通过大小和时间筛选结果的方法。

尺寸

您可以使用“ -size”参数按大小过滤。

我们在值的末尾添加一个后缀,用于指定计数方式。这些是一些受欢迎的选项:

  • c:字节
  • k:千字节
  • M:兆字节
  • G:千兆字节
  • b:512字节块

要查找正好为50个字节的所有文件,请键入:

find / -size 50c

要查找所有小于50个字节的文件,我们可以改用以下形式:

find / -size -50c

要查找所有超过700 MB的文件,我们可以使用以下命令:

find / -size +700M

时间

Linux存储有关访问时间,修改时间和更改时间的时间数据。

  • Access Time : Last time a file was read or written to.
  • 修改时间:上次修改文件内容的时间。
  • 更改时间:文件的inode元数据上次更改时间。

我们可以将它们与“ -atime”,“-mtime”和“ -ctime”参数一起使用。它们可以使用加号和减号来指定大于或小于,就像我们对size所做的那样。

此参数的值指定您要搜索多少天。

要查找具有一天前修改时间的文件,请键入:

find / -mtime 1

如果要在不到一天的时间内访问文件,可以键入:

find / -atime -1

要获取最后一次其元信息已更改超过3天的文件,请输入:

find / -ctime +3

我们还可以使用一些伴随参数来指定分钟而不是天:

find / -mmin -1

这将在最后一分钟为系统提供已被修改的文件。

Find还可以与参考文件进行比较,并返回更新的文件:

find / -newer myfile

按所有者和权限查找

您也可以按文件所有者或组所有者搜索文件。

您可以分别使用“ -user”和“ -group”参数来执行此操作。通过输入以下内容来查找“ syslog”用户拥有的文件:

find / -user syslog

类似地,我们可以通过键入以下内容来指定“影子”组所拥有的文件:

find / -group shadow

我们还可以搜索具有特定权限的文件。

如果要匹配一组确切的权限,请使用以下形式:

find / -perm 644

这将完全匹配具有指定权限的文件。

如果我们要指定至少具有这些权限的任何内容,则可以使用以下形式:

find / -perm -644

这将匹配具有其他权限的所有文件。在这种情况下,将匹配具有“ 744”权限的文件。

按深度过滤

在本节中,我们将在临时目录中创建目录结构。它将包含三级目录,第一级有十个目录。每个目录(包括temp目录)将包含十个文件和十个子目录。

通过发出以下命令来建立此结构:

cd
mkdir -p ~/test/level1dir{1..10}/level2dir{1..10}/level3dir{1..10}
touch ~/test/{file{1..10},level1dir{1..10}/{file{1..10},level2dir{1..10}/{file{1..10},level3dir{1..10}/file{1..10}}}}
cd ~/test

随时使用ls和cd检查目录结构,以了解事物的组织方式。完成后,返回测试目录:

cd ~/test

我们将研究如何从该结构返回特定文件。让我们尝试一个仅使用常规名称搜索的示例,以进行比较:

find -name file1
./level1dir7/level2dir8/level3dir9/file1
./level1dir7/level2dir8/level3dir3/file1
./level1dir7/level2dir8/level3dir4/file1
./level1dir7/level2dir8/level3dir1/file1
./level1dir7/level2dir8/level3dir8/file1
./level1dir7/level2dir8/level3dir7/file1
./level1dir7/level2dir8/level3dir2/file1
./level1dir7/level2dir8/level3dir6/file1
./level1dir7/level2dir8/level3dir5/file1
./level1dir7/level2dir8/file1
. . .

结果很多。如果将输出通过管道传输到计数器中,则可以看到总共1111个结果:

find -name file1 | wc -l
1111

在大多数情况下,这可能太多了,对您没有用。让我们尝试缩小范围。

您可以在顶级搜索目录下指定最大搜索深度:

find -maxdepth num -name query

要仅在“ level1”目录及以上目录中找到“ file1”,可以将最大深度指定为2(顶级目录为1,level1目录为1):

find -maxdepth 2 -name file1
./level1dir7/file1
./level1dir1/file1
./level1dir3/file1
./level1dir8/file1
./level1dir6/file1
./file1
./level1dir2/file1
./level1dir9/file1
./level1dir4/file1
./level1dir5/file1
./level1dir10/file1

这是一个更易于管理的列表。

如果您知道所有文件都位于当前目录下的某个点之后,则还可以指定一个最小目录:

find -mindepth num -name query

我们可以使用它仅查找目录分支末尾的文件:

find -mindepth 4 -name file
./level1dir7/level2dir8/level3dir9/file1
./level1dir7/level2dir8/level3dir3/file1
./level1dir7/level2dir8/level3dir4/file1
./level1dir7/level2dir8/level3dir1/file1
./level1dir7/level2dir8/level3dir8/file1
./level1dir7/level2dir8/level3dir7/file1
./level1dir7/level2dir8/level3dir2/file1
. . .

同样,由于我们的分支目录结构,这将返回大量结果(1000)。

您可以结合使用最小和最大深度参数来集中在一个狭窄的范围内:

find -mindepth 2 -maxdepth 3 -name file
./level1dir7/level2dir8/file1
./level1dir7/level2dir5/file1
./level1dir7/level2dir7/file1
./level1dir7/level2dir2/file1
./level1dir7/level2dir10/file1
./level1dir7/level2dir6/file1
./level1dir7/level2dir3/file1
./level1dir7/level2dir4/file1
./level1dir7/file1
. . .

执行和合并查找命令

您可以使用“ -exec”参数对找到匹配项的所有对象执行任意帮助程序命令。这样称呼:

find find_parameters -exec command_and_params {} \;

“ {}”用作查找匹配文件的占位符。 “ \;”用于使find知道命令在哪里结束。

例如,我们可以在上一部分中找到具有“ 644”权限的文件,并将其修改为具有“ 664”权限:

cd ~/test
find . -type f -perm 644 -exec chmod 664 {} \;

然后,我们可以像这样更改目录权限:

find . -type d -perm 755 -exec chmod 700 {} \;

如果要将不同的结果链接在一起,可以使用“-和”或“-或”命令。如果省略,则假定为“-”。

find . -name file1 -or -name file9 

使用定位查找文件

查找命令的替代方法是locate命令。该命令通常更快,并且可以轻松搜索整个文件系统。

您可以使用apt-get安装命令:

sudo apt-get update
sudo apt-get install mlocate

查找比查找更快的原因是因为它依赖于文件系统上文件的数据库。

通常每天使用cron脚本更新一次数据库,但是您可以通过键入以下内容进行手动更新:

sudo updatedb

立即运行此命令。请记住,如果要查找最近获取或创建的文件,则数据库必须始终是最新的。

要使用locate查找文件,只需使用以下语法:

locate query

您可以通过某些方式过滤输出。

例如,要仅返回包含查询本身的文件,而不是返回指向该查询的目录中每个包含查询的文件,可以使用“ -b”仅搜索“ basename”:

locate -b query

要使定位仅返回仍然存在于文件系统中的结果(在上一次“ updatedb”调用和当前“ locate”调用之间未删除的结果),请使用“ -e”标志:

locate -e query

要查看有关已分类信息的统计信息,请使用“ -S”选项:

locate -S
Database /var/lib/mlocate/mlocate.db:
    3,315 directories
    37,228 files
    1,504,439 bytes in file names
    594,851 bytes used to store database

结论

查找和定位都是在系统上查找文件的好方法。由您决定哪种工具适合每种情况。

查找和定位是功能强大的命令,可以通过管道将其与其他实用程序结合使用来增强它们。使用wc,sort和grep等命令进行过滤实验。