Linux Find 命令精通指南

blogdaren 2009-09-11 抢沙发 1528人次

简单介绍这一无处不在的强大的命令的 find

Linux find 命令是所有 Linux 命令中最有用的一个,它很强大,因为它允许您按文件名、文件类型、用户甚至是时间戳查找文件。使用 find 命令,您不但可以找到具这些属性任意组合的文件,还可以对它找到的文件执行操作。

[注意:本文使用的 find 版本是 GNU 版本,因此,某些细节可能与其他版本的 find 有所不同。]

另外默认find 命令是进行递归式搜索的

基本格式

开始之前,我们先来看一下 find 命令的基本结构:

# find  start_directory  test  options  criteria_to_matchaction_to_perform_on_results                


在以下命令中,find 将开始从当前目录(用“.”表示)开始(包括子目录)查找任何扩展名为“php”的文件:

# find . -name "*.php"  

以下命令将执行相同的操作。在这两种情况下,您都需要对通配符进行转义以确保它传递到 find 命令并且不由 shell 解释。因此,请将您的搜索字符串放到引号里,或者在它前面加上反斜线:


# find . -name \*.php

您还可以在搜索字符串中指定多个起始目录。如果以具有相应权限的用户身份运行,以下命令将下到 /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"

除文件名外,您还可以按类型搜索文件。例如,您可以使用以下命令查找一个目录中的所有子目录:

# find . -type d      

您可以使用以下命令查找您的/tmp 目录中的所有符号链接:

# find /tmp -type l

其他 find 可以找到的文件类型包括:

b — 块(缓存)特殊

c — 字符(未缓存)特殊

p — 命名管道 (FIFO)

s — 套接字

使用根作为 find 命令的起点会极大地降低系统的速度。如果您必须运行这样一个命令,您可以在非高峰时段或晚上运行它。您可以使用以下语法将输出重定向到一个文件:

# find  /  -print > masterfilelist.out

如果您错误地输入一个 find 命令,生成大量不必要的输出,只需按 CTRL-C 中断该命令,这将停止最近执行的命令。

还可以使用 -fstype 测试明确告知 find 在哪个文件系统中查找,如以下示例中所示:

# find / -name "*.txt" -fstype vfat 2> /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 /tmp/*.*

用 1 取代 -1 运行同一命令将查找恰好在 1 小时以前修改的所有文件:

# find . -mtime 1 /tmp/*.*

上述命令不会生成任何结果,因为它要求完全吻合。以下命令查找 1 个多小时以前修改的所有文件:

find . -mtime +1 默认情况下,-mtime、-atime 和 -ctime 指的是最近 24 小时。但是,如果它们前面加上了开始时间选项,则 24 小时的周期将从当日的开始时间算起。您还可以使用 mmin、amin 和 cmin 查找在不到 1 小时的时间内变化了的时间戳。

应该注意的是,使用 find 命令查找文件本身将更改该文件的访问时间作为其元数据的一部分。

您还可以使用 -newer、-anewer 和 –cnewer 选项查找已修改或访问过的文件与特定的文件比较。这类似于 -mtime、-atime 和 –ctime。

-newer 指内容最近被修改的文件

-anewer 指最近被读取过的文件

-cnewer 指状态最近发生变化的文件

要查找您的主目录中自上一个 tar 文件以来以某种方式编辑过的所有文件,使用以下命令:

# find . -newer backup.tar.gz 

按大小查找文件

-size 选项查找满足指定的大小条件的文件。要查找所有大于 5MB 的用户文件,使用:

# find / -size +5000000c  /tmp/*.*

结尾的“c”以字节为单位报告我们的结果。默认情况下,find 以 512 字节块的数量报告大小。如果我们将“c”替换为“k”,我们还会看到以千字节的数量报告的结果,如果使用“w”,则会看到以两字节字的数量报告的结果。

-size 选项经常用于搜索所有零字节文件并将它们移至 /tmp/zerobyte 文件夹。以下命令恰好可以完成这一任务:

# find test -type f -size 0 -exec mv {} /tmp/zerobyte \;

-exec 操作允许 find 在它遇到的文件上执行任何 shell 命令,大括号允许移动每个空文件。

选项 -empty 还可用于查找空文件:

# find test -empty   test/footest/test

按权限和所有者查找

要监视您的系统安全离不开 find 命令。您可以使用符号或八进制表示法查找面向广大用户开放的文件,如下所示:

# find . -type f -perm a=rwx -exec ls -l {} \;

系统管理员经常使用 find 通过用户或组的名称或 ID 搜索特定用户或组的常规文件:

# find / -type f -user root -exec ls -ls {} \;

您还可以使用 find 按组查找文件:

# find / -type f -group users

下一个命令将识别未列在 /etc/passwd 或 /etc/group 文件中的文件:

# find / -nouser -o -nogroup

上述命令可能不会在您的系统上生成实际的结果。但是,它可用于识别或许在经常移动后没有用户或组的文件。

与 Linux 中的许多命令不同,find 不需要 -r 或 -R 选项即可下到子目录中。它默认情况下就这样操作。但是,有时您可能希望限制这一行为。因此,选项 -depth、-maxdepth 和 -mindepth 以及操作 -prune 就派上用场了。

我们已经看到了 -prune 是多么有用,下面让我们来看看 -depth、-maxdepth 和 -mindepth 选项。

-maxdepth 和 -mindepth 选项允许您指定您希望 find 搜索深入到目录树的哪一级别。如果您希望 find 只在目录的一个级别中查找,您可以使用 maxdepth 选项。

通过运行以下命令在目录树的前三个级别中查找日志文件,您可以看到 -maxdepth 的效果。使用该选项较之不使用该选项所生成的输出要少得多。

# find / -maxdepth 3 -name "*log"

您还可以让 find 在至少下至目录树三个级别的目录中查找:

# find / -mindepth 3 -name "*log"

版权声明:除非注明,本文由( blogdaren )原创,转载请保留文章出处。

本文链接:Linux Find 命令精通指南

发表评论:

您的昵称:
电子邮件:
个人主页: