Linux Find命令精通指南作者:Sheryl Calish简单介绍这一无处不在的命令的强大的方面以及混乱的方面。
2008年7月发布Linux find命令是所有Linux命令中最有用的一个,同时也是最混乱的一个。
它很难,因为它的语法与其他Linux命令的标准语法不同。
但是,它很强大,因为它允许您按文件名、文件类型、用户甚至是时间戳查找文件。
使用find命令,您不但可以找到具这些属性任意组合的文件,还可以对它找到的文件执行操作。
本文的目的是,通过概述find命令的用途和潜能,简化该命令的学习和使用。
同时,它将针对find命令的某些最强大但最混乱的方面提供一个基本的指南和参考。
[注意:本文使用的find版本是GNU版本,因此,某些细节可能与其他版本的find有所不同。
]基本格式开始之前,我们先来看一下find命令的基本结构:find start_directory test options criteria_to_matchaction_to_perform_on_results在以下命令中,find将开始在当前目录(用“.”表示)中查找任何扩展名为“java”的文件:find.-name"*.java"下面是该命令所找到的命令的缩略清单:find.-name"*.java"./REGEXPvalidate/src/oracle/otnsamples/plsql/ConnectionManager.java./REGEXPvalidate/src/oracle/otnsamples/plsql/DBManager.java..[注意:如果您从本文剪切并粘贴来运行该find命令,您可能需要使用自己的键盘替换双引号(“”)才能得出正确的结果。
]以下命令将执行相同的操作。
在这两种情况下,您都需要对通配符进行转义以确保它传递到find命令并且不由shell解释。
因此,请将您的搜索字符串放到引号里,或者在它前面加上反斜线:find.-name\*.java尽管find的所有参数均为可选,但是如果您未指定从哪里开始搜索,搜索默认将在当前目录中开始。
如果您不指定要匹配的测试连接、选项或值,您的结果将不完整或者无区别。
运行以下三个find命令将得出同样的结果—当前目录和所有子目录中的所有文件(包括隐藏文件)的完整清单:findfind.find.-print这类似于运行一个带-la选项的ls命令。
如果您希望上述命令的输出包含完整的路径名(或许是为了备份),您将需要指定起始目录的完整路径:find/home/bluher-name\*.java/home/bluher/plsql/REGEXPvalidate/src/oracle/otnsamples/plsql/Connect ionManager.java/home/bluher/plsql/REGEXPvalidate/src/oracle/otnsamples/plsql/DBManag er.java/...您还可以在搜索字符串中指定多个起始目录。
如果以具有相应权限的用户身份运行,以下命令将下到/usr、/home/tmp目录查找所有jar文件:find/usr/home/tmp-name"*.jar"但是,如果您没有相应的权限,您在开始浏览许多系统目录时将生成错误消息。
以下是一个示例:find:/tmp/orbit-root:Permission denied您可以通过附加您的搜索字符串来避免混乱的输出,如下所示:find/usr/home/tmp-name"*.jar"2>/dev/null这会将所有错误消息发送到空文件,因此提供清理器输出。
默认情况下,find是区分大小写的。
对于不区分大小写的find,将-iname测试替换为-name测试。
find downloads-iname"*.gif"downloads/.xvpics/Calendar05_enlarged.gifdownloads/lcmgcfexsmall.GIF除文件名外,您还可以按类型搜索文件。
例如,您可以使用以下命令查找一个目录中的所有子目录:find.-type d您可以使用以下命令查找您的/usr目录中的所有符号链接:find/usr-type l这可能会列出3,000多个链接。
以下的任何一个命令使用根权限运行都将列出/usr目录中的链接以及它所指向的文件:#find/usr/bin-type l-name"z*"-exec ls-l{}\;lrwxrwxrwx1root root8Dec1223:17/usr/bin/zsh->/bin/zsh lrwxrwxrwx1root root5Dec1223:17/usr/bin/zless->zmore lrwxrwxrwx1root root9Dec1223:17/usr/bin/zcat->/bin/zcatfind/usr/bin-type l-name"z*"-ls但是,第二个更短的命令将列出更多的文件,以及目录和inode信息:在本文后面的部分中,我们将讨论-exec和-ls操作的用法。
其他find可以找到的文件类型包括:•b—块(缓存)特殊•c—字符(未缓存)特殊•p—命名管道(FIFO)•s—套接字使用根作为find命令的起点会极大地降低系统的速度。
如果您必须运行这样一个命令,您可以在非高峰时段或晚上运行它。
您可以使用以下语法将输出重定向到一个文件:find/-print>masterfilelist.out如果您错误地输入一个find命令,生成大量不必要的输出,只需按CTRL-C中断该命令,这将停止最近执行的命令。
在具多个文件系统的企业网络上,限制find查找的文件也是一个特别好用的方法。
尽可能多地使用选项和测试以减少系统上的负载。
用于此目的的两个最有用的选项是-xdev和-mount。
它们通过阻止find下到其他文件系统(如MS-DOS、CD-ROM或AFS)上的目录中缩短了搜索范围。
这将搜索限制为同一类型的文件系统作为起始目录。
如果运行mount命令,双引导系统上的用户可以使用这些选项。
假设涉及Windows分区,您可以使用类似以下的命令安装它:mount-t vfat/dev/sda1/mnt/msdos您使用的实际命令取决于您的系统设置。
您可以通过运行df或执行以下命令验证该分区已安装:find/mnt/msdos-name"*.txt"2>/dev/null您应该看到MS Windows分区上列出了很多的文件。
现在,运行以下带-mount 或-xdev选项的命令:find/-name"*.txt"-mount2>/dev/null或者find/-name"*.txt"-xdev2>/dev/null还可以使用-fstype测试明确告知find在哪个文件系统中查找,如以下示例中所示:find/-name"*.txt"-fstype vfat2>/dev/null查找时间find命令有几个用于根据您系统的时间戳搜索文件的选项。
这些时间戳包括•mtime—文件内容上次修改时间•atime—文件被读取或访问的时间•ctime—文件状态变化时间mtime和atime的含义都是很容易理解的,而ctime则需要更多的解释。
由于inode维护着每个文件上的元数据,因此,如果与文件有关的元数据发生变化,则inode数据也将变化。
这可能是由一系列操作引起的,包括创建到文件的符号链接、更改文件权限或移动了文件等。
由于在这些情况下,文件内容不会被读取或修改,因此mtime和atime不会改变,但ctime将发生变化。
这些时间选项都需要与一个值n结合使用,指定为-n、n或+n。
•-n返回项小于n•+n返回项大于n•n返回项正好与n相等下面,我们来看几个例子,以便于理解。
以下命令将查找在最近1小时内修改的所有文件:find.-mtime-1./plsql/FORALLSample./plsql/RegExpDNASample/plsql/RegExpSample用1取代-1运行同一命令将查找恰好在1小时以前修改的所有文件:find.-mtime1上述命令不会生成任何结果,因为它要求完全吻合。
以下命令查找1个多小时以前修改的所有文件:find.-mtime+1默认情况下,-mtime、-atime和-ctime指的是最近24小时。
但是,如果它们前面加上了开始时间选项,则24小时的周期将从当日的开始时间算起。
您还可以使用mmin、amin和cmin查找在不到1小时的时间内变化了的时间戳。
如果您在登录到您的帐户后立即运行以下命令,您将找到在不到1分钟以前读取的所有文件:find.-amin-1./.bashrc/.bash_history./.xauthj5FCx1应该注意的是,使用find命令查找文件本身将更改该文件的访问时间作为其元数据的一部分。
您还可以使用-newer、-anewer和–cnewer选项查找已修改或访问过的文件与特定的文件比较。
这类似于-mtime、-atime和–ctime。
•-newer指内容最近被修改的文件•-anewer指最近被读取过的文件•-cnewer指状态最近发生变化的文件要查找您的主目录中自上一个tar文件以来以某种方式编辑过的所有文件,使用以下命令:find.-newer backup.tar.gz按大小查找文件-size选项查找满足指定的大小条件的文件。
要查找所有大于5MB的用户文件,使用find/-size+5000000c2>/dev/null/var/log/lastlog/var/log/cups/access_log.4/var/spool/mail/bluher结尾的“c”以字节为单位报告我们的结果。
默认情况下,find以512字节块的数量报告大小。
如果我们将“c”替换为“k”,我们还会看到以千字节的数量报告的结果,如果使用“w”,则会看到以两字节字的数量报告的结果。
-size选项经常用于搜索所有零字节文件并将它们移至/tmp/zerobyte文件夹。
以下命令恰好可以完成这一任务:find test-type f-size0-exec mv{}/tmp/zerobyte\;-exec操作允许find在它遇到的文件上执行任何shell命令。
在本文的后面部分,您将看到其用法的更多示例。