find
我们通常使用find这个命令来搜索文件,它十分有效,不过对于刚用linux的新手而言,在使用上总是觉得有点棘手。一定程度上就是因为它所自带的选项、测试、参数动作类型以及一个参数的结果能够影响到之后的参数的处理。在我们研究选项、测试以及参数之前,让我们先来看一个简单的例子,在你本地的机器上搜索名叫test的文件。不过做之前请确保你当前为root用户状态,以避免权限的问题。
# find / -name test -print
/usr/bin/test
#
依赖于你的本地安装设置,也许你还会找到其他的文件名称也为test。同你所猜想的一样,这条命令的意思就是:在根目录\下搜素名叫test的文件并将他们打印出来。是不是很简单,我想应该是这样。
不过,find命令会花费相当长的一小段时间来扫描你的本地主机以及你所在网络中的Windows主机的分区,这是因为我们的的linux系统通过SAMBA挂载了网络中所共享的Windows主机文件系统。虽然看起来似乎扫描一下也好,不过我们都清楚我们只想要找分布在linux系统上的文件。对此,我们就学习到了我们所要用到的第一个find选项:-mount。它可以告诉find不用去搜索系统所挂载的目录。
# find / -mount -name test -print
好了,接下来让我们了解find命令的语法构成:
find [path] [option] [tests] [actions]我们先来看第一个:path,很简单,就是我们所要搜索的目录路径,可以使用绝对路径,也可以使用相对路径。如果你想要使用多个路径的话,可以直接使用,像这样:find /var /home。
接下来,就是选项,下表为大家罗列一下主要的几个,分别是:
Option | Meaning |
-depth | 在查看目录本身前先搜索目录下的内容 |
-follow | 跟随符号链接 |
-maxdepths N | 搜索指定目录时最多搜索该目录下N级目录 |
-mount(or -xdev) | 不搜索目录下的其他文件系统目录 |
好了,下面轮到tests。对于find命令,它含有大量的tests选项,并且每一个test都只返回true或者false。当find运行时,它将定义好的命令中的每一个test选项都应用到所找到的文件上。如果test返回false,则find跳过该文件;反之,test返回true,则find会接着应用下一个test选项或者运行命令对该文件所要执行的操作。下面,我们在表格中罗列了普遍使用的test选项:
Test | Meaning |
-atime N | 该文件至少N天前被访问过 |
-mtime N | 该文件至少N天前被修改过 |
-name pattern | 文件名同所提供的模式相匹配 |
-newer otherfile | 该文件比所提供的otherfile新 |
-type C | 该文件的文件类型为C,常用文件类型:d--目录 f--一般文件 |
-user username | 该文件的属主为所提供的用户 |
你也可以在test选项上使用操作符,大多包含两种形式:short form和long form。如下表所示:
Operator,Short Form | Operator,Long Form | Meaning |
! | -not | 反转test选项 |
-a | -and | test选项都必须为true |
-o | -or | test选项至少有一个必须为true |
你可以通过使用圆括号来强制tests与操作符之间的优先顺序。由于对shell而言,圆括号有特别的意义,所以我们必须要用反斜杠(\)来引用括号。另外,如果你想要使用模式来匹配文件名的话,必须使用引号,以便当文件名不匹配时,find直接将其舍弃。举例说明如下,如果你想写的test内容为:搜索比文件X新或者文件名以“_”开头的文件,你可以这样写test:
\(-newer X -o -name "_*" \)
下面是几个使用了tests的find实例:
在当前目录下搜索比文件while2更新的文件
$ find . -newer while2 -print
除此之外,我们可以要求更细致一些,在在当前目录下不搜索目录,只搜索比文件while2更新的一般文件,因此我们需要添加额外的test
$ find . -newer while2 -type f -print
下一个例子,在当前目录下搜寻文件名以“_”开头或者比文件while2更新的文件,不过此文件必须是一般文件。
$ find . \( -name "_*" -or -newer while2 \) -type f -print
Ok,既然我们已经掌握了搜索文件,接下来就让大家来看一下当我们找到了我们所学的文件之后所要做的动作(actions)。当然,我们在此也只列出了最普遍的几个动作,具体的可以参考相关的手册。
Action | Meaning |
-exec command | 执行一个命令。此动作必须以\;结尾 |
-ok command | 与-exec相似,除了它会在执行命令前,对每个即将实现命令的文件都进行用户确认提示。 当然此动作也必须以\;结尾 |
输出文件的名字 | |
-ls | 在当前目录使用命令ls -dilstrue |
-exec和-ok命令后面都带有后续参数,这些参数都好像是他们原先参数的一部分一样,直到结尾处的\;。实际上,-exec和-ok命令是在运行一个内嵌的命令,因此才需要以一个转义了的分号来结尾,这样find命令才能够继续执行事先定义好的命令行选项。除此之外,字符串“{ }”在-exec和-ok命令里,是一个很特别的参数,它用来表示当前文件的全部路径。上面说的可能不太容易搞懂,那我们就以一个实例来说明。
$ find . -newer while2 -type f -exec ls -l {} \;
如你所见,find命令的确是十分的有用,虽然我们需要多做些练习来熟练掌握它。