转的 原文:http://www.tongcx.com/node/86
正如它的名字所表示的,find是在磁盘中查找满足给定标准的文件和目录的应用程序。默认情况下,它从当前目录开始,向下扫描所有子目录。Find基于各种不同的文件属性来进行查询,而且可以对查询结果执行某种操作,通常是对每个查询结果运行一些程序。
让我们来看一些例子:首先,为了在当前目录或子目录中查找所有html文件,我们可以使用:find -name "*.html" -type f
该命令有两个测试条件,第一个,“-name”用于检验搜索过程中的每个文件名,如果你需要对大小写敏感,可以使用“-iname”代替。第二个参数是 “-type”,它用于指定你感兴趣的文件类型。“f”表示我们查找的是普通文件,我们可以使用“d”表示目录或使用“l”表示符号连接。在 find 手册中可以看到该工具的所有选项。
在上面的这个例子中,因为我们要在当前目录中搜索,所以没有指定路径。你可以从你的系统中的任何目录开始搜索,例如,你知道html文件存放在两个位置之一中,那么我们就可以通过指定一个开始搜索点使查询更快更准确。
find /var/www /home/nickg/public_html -name "*.html" -type f
这个查询从web服务器的根目录开始,搜索我的html根目录和它的子目录,希望能够得到我们想要的结果,而不是像web浏览器缓存或html帮助文件。
默认情况下,find遍历所有子目录,但是你可以通过指定最大深度来控制这个行为。在前面的例子中,如果我们只想搜索这两个目录不想搜索下一层,你可以 添加“-maxdepth 1”到命令中。设置最大深度为0表示只检验命令行中的给定文件。同样,你可以设定最小深度,从而避免搜索位于根目录的文件。
find 的另一个应用是搜索属于某个给定用户的文件,因此为了搜索我的系统中所有属于我的文件,我使用以下命令:find / -user nickg
同样可以搜索基于组用户的文件,使用“-group”参数。
另外的测试分类与时间相关,我们可以用基于时间的方式来搜索文件,可以分别使用“-ctime”,“-atime”和“-mtime”参数来指定最后创建时间,最后访问时间和最后修改时间。例如要搜索前天创建的文件,可以使用:find -ctime -1
注意1前面的“-”表示我们是从今天向以前的日期范围搜索。如果你需要更精确地搜索,可以使用分钟变量“-cmin”,“-amin”和“-mmin”。如果你刚犯了一个错误但不确定会影响到那些文件,这很简单可以使用如下查询:find -mmin -5
find对文件执行的标准行为是显示出文件名,这就是为什么如果你跟踪结果,就会看到一系列文件名的原因。如果你想使用这些结果作为另外一个过滤器的输入的话,这将会十分有用。但是如果你需要结果的更多信息,你可以令find输出与ls –l 同样的结果:
find -user nickg -iname "*.html" –ls
这个命令将会返回文件权限和时间信息。
最后,你可以通过使用“-exec”参数,来让find命令对每个搜索结果运行任何程序。下面的程序将会删除你的home目录中所有扩展名为“.tmp”的文件。
find -name ".tmp" -exec rm {} ;
上面两个大括号将会被相应的文件名代替,反斜杠用来告诉find何时命令结束。Find常和chmod结合使用快速改变大量文件的文件权限,或者和 grep与sed结合使用来选择性的搜索或使用正则表达式修改文本。这仅是与find相关使用技巧的冰山一角,使用它作为一个脚本的输入,你可以让费时的 任务自动完成,例如清除一年内没有访问的文件,或者自动备份修改的文件。Find的这种强大更能意味着它仍将是linux用户用来处理任务的最好工具之 一。
========我是分割线==========
通过文件名查找法:
这个方法说起来就和在WINDOWS下查找文件一样容易理解了。如果你把这个文件放在单个的文件夹里面,只要使用常见的“ls"命令就能方便的查找出 来,那么使用“find”命令来查找它就不能给你留下深刻的印象,毕竟“find”命令的强大功能不止这个。如果知道了某个文件的文件名,而不知道这个文 件放到哪个文件夹,甚至是层层套嵌的文件夹里。举例说明,假设你忘记了httpd.conf这个文件在系统的哪个目录下,甚至在系统的某个地方也不知道, 则这是可以使用如下命令:
find / -name httpd.conf
这个命令语法看起来很容易就明白了,就是直接在find后面写上 -name,表明要求系统按照文件名查找,最后写上httpd.conf这个目标文件名即可。稍等一会系统会在计算机屏幕上显示出查找结果列表:
etc/httpd/conf/httpd.conf
这就是httpd.conf这个文件在Linux系统中的完整路径。查找成功。
如果输入以上查找命令后系统并没有显示出结果,那么不要以为系统没有执行find/ -name httpd.conf命令,而可能是你的系统中没有安装Apache服务器,这时只要你安装了Apache Web服务器,然后再使用find / -name httpd.conf就能找到这个配置文件了。
无错误查找技巧:
在Linux系统中“find”命令是大多数系统用户都可以使用的命令,并不是ROOT系统管理员的专利。但是普通用户使用“find”命令时也有可能 遇到这样的问题,那就是Linux系统中系统管理员ROOT可以把某些文件目录设置成禁止访问模式。这样普通用户就没有权限用“find”命令来查询这些 目录或者文件。当普通用户使用“find”命令来查询这些文件目录是,往往会出现"Permissiondenied."(禁止访问)字样。系统将无法查 询到你想要的文件。为了避免这样的错误,我们可是使用转移错误提示的方法尝试着查找文件,输入
find / -name access_log 2>/dev/null
这个方法是把查找错误提示转移到特定的目录中去。系统执行这个命令后,遇到错误的信息就直接输送到stderrstream 2 中,access_log 2就是表明系统将把错误信息输送到stderrstream 2中,/dev/null是一个特殊的文件,表明空的或者错误的信息,这样查询到的错误信息将被转移了,不会再显示了。
在Linux系统查找文件也会遇到这样一个实际问题。如果我们在整个硬盘,这个系统中查找某个文件就要花费相当长的一段时间,特别是大型Linux系统 和容量较大的硬盘,文件放在套嵌很深的目录中的时候。如果我们知道了这个文件存放在某个大的目录中,那么只要在这个目录中往下找就能节省很多时间了。使用 find /etc -name httpd.conf 就可以解决这个问题。上面的命令就是表示在etc目录中查询httpd.conf这个文件。这里再说明一下“/ ”这个函数符号的含义,如果输入 “find/ ”就是表示要求Linux系统在整个ROOT目录下查找文件,也就是在整个硬盘上查找文件,而“find/etc”就是只在 etc目录下查找文件。因为“find/etc”表示只在etc目录下查找文件,所以查找的速度就相应要快很多了。