当前位置: 首页 > 科技观察

使用find命令在Linux上查找文件和目录

时间:2023-03-19 21:47:25 科技观察

无论我决定如何组织我的文件,似乎总有找不到它们的时候。有时是因为我不记得原始文件名,有时是知道文件名但不记得保存位置。甚至有时我需要一个我一开始没有创建的文件。但是,无论我遇到什么困难,我都知道在POSIX系统上,总有find命令可以帮助我。安装findfind命令由POSIX规范定义,该规范创建了一个用于衡量POSIX系统的开放标准,其中包括Linux、BSD和macOS。简而言之,只要您运行的是Linux、BSD或macOS,就已经安装了find。然而,并不是所有的查找命令都是生而平等的。例如,GNU的find命令具有一些BSD、Busybox或Solaris上的find命令可能没有或没有但实现方式不同的功能。由于GNUfind的可用性和流行性,本文使用了findutils包中的GNUfind。本文中演示的大多数命令都可以与find的其他实现一起使用,但如果您在Linux以外的平台上尝试命令并获得意外结果,请尝试下载并安装GNU版本。按名称查找文件您可以使用正则表达式来查找使用完整或部分文件名的文件。find命令要求你给出你要查找的目录;指定搜索属性选项,例如-name指定区分大小写的文件名;然后是搜索字符串。默认情况下,搜索字符串按字面意思处理:除非您使用正则表达式语法,否则find命令会搜索您在引号之间输入的文件名。假设您的Documents目录包含四个文件:Foo、foo、foobar.txt和foo.xml。这是foo的字面搜索:$find~-name"foo"/home/tux/Documents/examples/foo您可以使用-iname选项使其不区分大小写以扩大搜索范围:$find~-iname"foo"/home/tux/Documents/examples/foo/home/tux/Documents/examples/Foovwildcard您可以使用基本的shell通配符来扩展您的搜索。例如,*表示任意数量的字符:$find~-iname"foo*"/home/tux/Documents/examples/foo/home/tux/Documents/examples/Foo/home/tux/Documents/examples/foo。xml/home/tux/Documents/examples/foobar.txt?对于单个字符:$find~-iname"foo*.???"/home/tux/Documents/examples/foo.xml/home/tux/Documents/examples/foobar.txt这不是正则表达式语法,所以.在示例中仅表示字母“点”。正则表达式您还可以使用正则表达式。与-iname和-name一样,有区分大小写和不区分大小写的选项。但不同之处在于-regex和-iregex搜索应用于整个路径,而不仅仅是文件名。这意味着如果您搜索foo,您将得不到任何结果,因为foo与/home/tux/Documents/foo不匹配。相反,您必须搜索整个路径,或者在字符串的开头使用通配符:$find~-iregex".*foo"/home/tux/Documents/examples/foo/home/tux/Documents/examples/Foo查找一周内修改过的文件要查找过去一周内修改过的文件,请使用-mtime选项和过去的天数(负数):$find~-mtime-7/home/tux/Documents/examples/foo/home/tux/Documents/examples/Foo/home/tux/Documents/examples/foo.xml/home/tux/Documents/examples/foobar.txt查找最近几天修改过的文件你可以使用-mtime选项结合查找最近几天修改过的文件。对于第一个-mtime参数,自上次修改文件以来的最近天数。第二个参数表示最大天数。例如,要搜索1天前但不超过7天前修改的文件:$find~-mtime+1-mtime-7通常通过指定正在修改的文件类型来优化find的结果找了。如果您不确定要查找的内容,则不应使用此选项。但是,如果您知道要查找的是文件而不是目录,或者是目录而不是文件,那么这可能是一个很好的过滤器。选项是-type,它的参数是代表不同数据类型的字母代码。最常见的是:d-目录f-文件l-链接文件s-套接字p-命名管道(用于FIFO)b-块设备(通常是硬盘)以下是一些示例:$find~-typed-name"Doc*"/home/tux/Documents$find~-typef-name"Doc*"/home/tux/Downloads/10th-Doctor.gif$find/dev-typeb-name"sda*"/dev/sda/dev/sda1resizingfind命令默认是递归的,即会在指定目录下逐层查找结果。这在大型文件系统上可能变得难以承受,但您可以使用-maxdepth选项控制搜索深度:$find/usr-iname"*xml"|wc-l15588$find/usr-maxdepth2-iname"*xml"|wc-l15也可以使用-mindepth设置最小递归深度:$find/usr-mindepth8-iname"*xml"|wc-l9255下载备忘单本文只介绍find的基本功能,是一个很好的搜索工具,但是它也是强大的并行命令的一个非常有用的前端。学习find的原因有很多,因此请下载我们的免费find备忘单,以帮助您了解有关该命令的更多信息。