`

(转)find:根据指定条件查找文件

 
阅读更多

find:根据指定条件查找文件

find 是一个资深的 UNIX® 工具。它的功能在于递归扫描一个或多个目录,从中查找匹配指定条件的文件。尽管此工具非常有用,但语法却十分复杂,使用的时候也需要多多练习。最普通的语法是这样的:

find [选项] [目录] [条件] [动作]

如果您不指定任何目录,find 将会查找当前目录。如果您不指定条件,则条件相当于“true”,这样会把全部文件都找出来。选项、条件和动作的设置十分繁多,我们在这里只会提到其中的少数几个。首先,让我们来看看着几个选项:

  • -xdev:不在其它文件系统的目录中搜索。

  • -mindepth <n>:搜索文件时至少要深入到指定目录的第 n 层子目录。

  • -maxdepth <n>:搜索文件时最多深入到指定目录的第 n 层子目录。

  • -follow:如果符号链接到目录,则跟随符号链接进入。默认情况下,find 不跟随链接。

  • -daystart:当使用与事件相关的测试时(见下文),将当天的开始时间作为时间戳,而不是默认值(从当前时间倒退24个小时)。

条件可以是一个或多个原子测试。这是一些有用的测试:

  • -type <文件类型>:搜索给定类型的文件。文件类型可以是以下之一:f(普通文件)、d(目录)、l(符号链接)、s(套接字)、b(块模式文件)、c(字符模式文件)或p(命名管道)。

  • -name <模式>:查找文件名与给定模式匹配的文件。使用此选项,模式将被看作shell 全局模式(参见“Shell 通配符”一节)。

  • -iname <模式>:与 -name 类似,但不区分大小写。

  • -atime <n>-amin <n>:查找上次访问时间在 n 天前(-atime)或 n 分钟前(-amin) 的文件。您还可以指定 <+n> 或 <-n>,这代表要搜索访问时间在至多或者至少 n 天/分钟前的文件。

  • -anewer <文件>:查找上次访问时间晚于文件的文件。

  • -ctime <n>-cmin <n>-cnewer <file>:与 -atime-amin 和 -anewer 相同,但比较的是文件上次修改的时间。

  • -regex <模式>:与 -name 相同,但模式将被看作正则表达式

  • -iregex <pattern>:与 -regex 相同,但不区分大小写。

可供选择的设置还有很多,请参看 find(1) 中的详情。要进行组合测试,您可以使用以下格式之一:

  • <c1> -a <c2>:如果 c1 和 c2 都为 true,则结果为 true;-a 是隐含的,也就是说如果您想要同时测试 c1c2 和 c3 三个条件,只需输入<c1> <c2> <c3>

  • <c1> -o <c2>:如果 c1 或 c2 中至少有一个是 true,则结果为 true。请注意 -o 的优先级低于 -a,因此如果您想要匹配满足条件 c1 或 c2,且满足 c3 的文件,您就需要使用括号,即( <c1> -o <c2> ) -a <c3>。您还必须对括号进行转码,否则括号将被 shell 加以解释!

  • -not <c1>:测试 c1 的相反结果,因此如果 c1 是 false 的话,-not <c1> 就是 true。

最后,您可以为找到的文件指定一个动作。最常用的有:

  • -print:仅仅将每个文件的名称打印在标准输出。这是默认动作。

  • -ls:对每个找到的文件以 ls -ilds 的格式打印在标准输出上。

  • -exec <命令行>:对每个找到的文件依次执行命令行命令行必须以分号(;)结尾,您还必须对其进行转码,以防 shell 对其进行解释;文件位置以 {} 进行标记。请参看用法的例子。

  • -ok <命令>:与 -exec 相同,但对每个命令都请求用户确认。

要理解这些选项和参数最好的方法是执行一些例子。现在,您想要在 /usr/share 目录中查找全部目录,只需输入:

find /usr/share -type d

假设您有 HTTP 服务器,而您所有的 HTML 文件都存在 /var/www/html,该目录也是您的当前目录。您想要查找一个月来没有编辑过的全部文件。由于您拥有来自不同作者的页面,所以有些文件的扩展名是 html,有些文件的扩展名是htm。您想要将这些文件链接在目录 /var/www/obsolete 中。您应该输入[17]

find \( -name "*.htm" -o -name "*.html" \) -a -ctime -30 \
-exec ln {} /var/www/obsolete \;

这个例子看起来有点复杂,我们会进行详细解释。这里所用的条件是:

\( -name "*.htm" -o -name "*.html" \) -a -ctime -30

它所完成的功能正是我们想要的:它会找到文件名以 .htm 或 .html\( -name "*.htm" -o -name "*.html" \)” 结尾的文件,而且(-a) 在最近的三十天内没有修改过,这大概是一个月(-ctime -30)。请额外注意括号:这里的括号时必需的,因为 -a 的优先级较高。如果没有括号的话,将会找到所有以 .htm 结尾的文件,以及所有一个月以来没有修改过且以 .html 结尾的文件。这显然不是我们所需要的结果。您还应该注意括号需要在 shell 中加以转码:如果我们写的是 ( .. ),而不是 \( .. \),那么 shell 就会对括号进行解释,并且试图在子 shell 中执行 -name "*.htm" -o -name "*.html"……另外一种解决方案是将括号放在双引号或单引号中,但是我们更愿意在此使用反斜线,因为这里只有一个字符。

最后,还要对每个文件执行这个命令:

-exec ln {} /var/www/obsolete \;

这里,您仍然需要对分号(;)进行转码,否则 shell 会将其解释为命令分隔符。如果您忘记了进行转码,find 将会抱怨说 -exec 缺少一个参数。

最后一个例子:您有一个非常大的目录(/shared/images),其中包含各种图像。通常,您会使用 touch 命令更新此目录中名为 stamp 的文件的时间,这样您就会有一个可参考的时间。您想要找到比 stamp 文件新的所有 JPEG 图像,但是您的图像来源各不相同,文件扩展名有 jpgjpegJPG 以及 JPEG。您还想要不在 old 目录中搜索。不仅如此,您还想要将此文件列表发送给您,而您的用户名是 li_si

find /shared/images -cnewer     \
     /shared/images/stamp       \
     -a -iregex ".*\.jpe?g"     \
     -a -not -regex ".*/old/.*" \
       | mail li_si -s "New images"

当然,如果您每次都要重复输入的话,这个命令确实没什么用。您可能会想要定时执行该命令。要定时运行命令,最简单的方法就是使用下一节介绍的 cron 守护程序。


 

分享到:
评论

相关推荐

    vc++ 查找指定目录指定类型所有文件

    单独写的文件,已使用vs2008的项目测试过代码可用 主要功能是查找设置的目录下所有该类型的文件,然后保存在结构体中, 代码作者菜鸟一枚,漏缺之处往指出

    查找文件夹下指定文件(C++)

    第二个参数为输出参数,输出匹配到的文件信息(包括文件名,文件路径,和一个对应WIN32_FIND_DATA结构) 地三个参数为可选的输入参数,输入扩展名信息,扩展名格式为(.cpp, *.cpp, cpp)三者都可,大小写不区分,如果为...

    Find 精准查找 在文本文件中过滤,包含指定字符串的行

    Find 精准查找 在文本文件中过滤,包含指定字符串的行

    快速检索指定文件.rar_extension find_查找文件_查找文件名

    首先指定要查找的目录,然后填入要查找的文件名,注意到带扩展名 也可以查找文件夹.

    操作系统实验三:实现一个文件查找程序

    仿照unix操作系统中的find命令,在windows上实现一个find命令。find命令从指定的目录下开始,递归地查找指定文件。其命令格式如下: find PATH -option 参数 [-print] [-exec 命令 {} \;]

    Linux文件查找命令之find讲解.doc

    Linux下find命令提供了相当多的查找条件,功能很强大。由于find具有强大的功能,所以它的选项也很多,其中大部分选项都值得我们花时间来了解一下。即使系统中含有网络文件系统( NFS),find命令在该文件系统中同样...

    linux 常用的30个命令总结.docx

    linux常用命令大全 1. ls :列出当前目录下的文件和文件夹。 2. cd :更改当前工作目录。 3. pwd:显示当前目录的...13. find:在指定目录中查找文件。 14. tar:用于压缩和解压缩文件和目录。 15. gzip :压缩文件。

    文件查找程序myfind(请大家不要copy,注意知识产权)

    find命令从指定的目录下开始,递归地查找指定文件。其命令格式如下: find PATH -option 参数 [-print] [-exec 命令 {} \;] PATH:查找的起始目录。 -option 参数:用来控制搜索方式,具体如下(以下只列出最常用的...

    linux 常用命令总结.docx

    13. find:在指定目录中查找文件。 14. tar:用于压缩和解压缩文件和目录。 15. gzip :压缩文件。 16. gunzip :解压文件。 17. top :显示正在运行的进程和系统资源的使用情况。 18. ps :显示当前用户的进程信息...

    Linux Find命令的使用 实现高效精准查找

    Linux下find命令在目录...find命令提供了相当多的查找条件,功能很强大。即使系统中含有网络文件系统( NFS), find命令在该文件系统中同样有效。在运行一个非常消耗资源的find命令时,很多人都倾向于把它放在后台执行。

    实现一个文件查找程序(linux)实现代码

    myfind命令从指定的目录下开始,递归地查找指定文件。其命令格式如下: myfind PATH -option 参数 [-print] [-exec 命令 {} \;] PATH:查找的起始目录。 -option 参数:用来控制搜索方式,具体如下(以下只给我常用...

    find命令查询指定时间的大文件并删除

    Linux下find命令查询指定时间的大文件并删除 1.常规方法 1.1 语法: 使用find命令和rm命令结合使用删除指定时间的文件 --时间单位为天 find 查询路径 -ctime/-mtime/-atime 时间范围 -name 文件名称 -type f -exec ...

    查找指定目录下的所有文件

    提供一个查找指定目录下所有文件的函数,函数头如下: void CMyDlg::FindFileS(CString path, CString name, bool isdir)//CString path为路径(例:d:\\123),CString name为名称字,支持通配符(例:*.txt),bool ...

    Linux实现类似find命令的myfind

    仿照unix操作系统中的find命令,在实现一个myfind命令。myfind命令从指定的目录下开始,递归地查找指定文件

    Linux系统配置及服务管理:文件查找

    Linux系统配置及服务管理:文件...而今天的主角find查找命令是在linux中最重要也是应用最多的,通常的用法是在指定目录里查找文件。 find的语法是 :find [ path…] [options] [expression] [action] 命令 路径 选项

    linux常用命令大全及详解.zip

    find:在文件系统中查找文件或目录。 chmod:修改文件或目录的权限。 chown:修改文件或目录的所有者。 chgrp:修改文件或目录的所属组。 tar:打包和解包文件。 gzip:压缩文件。 unzip:解压缩文件。 ssh:远程...

    linux第二章实验讲解.mp4

    find :查找文件或目录 格式: find 查找路径范围 查找方式 查找内容 查找方式分类: -name 查找文件名称 -user 查找文件所有者 -size 查找文件大小 +10m大于10m -10m小于 -type 查找文件类型:f文件 d目录 b...

    Linux文本查找命令find的用法详解

    find 命令主要用于查找目录和文件,可以指定多种参数进行匹配。 用法:find +查找路径 +命令参数 [输出形式] 查找路径:告诉find在哪查找 命令参数:指定要查找的文件属性,属性包括多种,类型、名称、大小、修改...

    云计算Linux文件查找与压缩干货

    ③指定查找的目录深度: [root@qianfeng ~]# find / -maxdepth 3 -a -name "ifcfg-en*" 这里maxdepth是深度 后面的数字是几级目录 [root@qianfeng ~]# find / -maxdepth 4 -a -name "ifcfg-en*" ...

    【Linux命令篇】find命令-查找与清理过期文件

    1、目录层级、文件类型、文件名过滤查找 find /data -maxdepth 1 -type f -name *.sh find /data -maxdepth 1 -type d -name code 2、逻辑操作符,与-a、或-o、非! find /data -name *.sh -a -name *test* find /...

Global site tag (gtag.js) - Google Analytics