The Linux Command Line——18. 查找文件
locate - 查找文件的简单方法
例如,我们想要找到所有名字以“zip”开头的程序。因为我们正在查找程序,可以假定包含程序的目录以 “bin/” 结尾。
locate 命令将会搜索它的路径名数据库,输出任一个包含字符串“bin/zip”的路径名:
locate 可以结合其它工具,比如说 grep 命令
find - 查找文件的复杂方式
在它的最简单的使用方式中,find 命令接收一个或多个目录名来执行搜索。例如,输出我们的家目录的路径名列表(包括文件及目录)。
让我们使用 wc 程序来计算出文件的数量:
Tests
比如说我们想在我们的搜索中得到目录列表。我们可以添加以下测试条件:
添加测试条件-type d 限制了只搜索目录。相反地,我们可以使用这个测试条件来限定搜索普通文件:
我们查找所有文件名匹配通配符模式“*.JPG”和文件大小大于 1M 的普通文件:
在这个例子里面,我们加入了 -name 测试条件,后面跟通配符模式。注意,我们把它用双引号引起来,从而阻止 shell 展开路径名。紧接着,我们加入 -size 测试条件,后跟字符串“+1M”。开头的加号表明我们正在寻找文件大小大于指定数的文件。若字符串以减号开头,则意味着查找小于指定数的文件。若没有符号意味着“精确匹配这个数”。结尾字母“M”表明测量单位是兆字节。下面的字符可以被用来指定测量单位:
find 命令支持大量不同的测试条件。下表是列出了一些常见的测试条件。请注意,在需要数值参数的情况下,可以应用以上讨论的“+”和“-”符号表示法:
操作符
即使拥有了 find 命令提供的所有测试条件,我们还需要一个更好的方式来描述测试条件之间的逻辑关系。例如,如果我们需要确定是否一个目录中的所有的文件和子目录拥有安全权限,怎么办呢?我们可以查找权限不是 0600 的文件和权限不是 0700 的目录。
预定义的操作
我们可以使用 find 命令来删除符合一定条件的文件。例如,来删除扩展名为“.BAK”(这通常用来指定备份文件)的文件,我们可以使用这个命令:
这个命令会查找每个文件名以.BAK (-name ‘*.BAK’) 结尾的普通文件(-type f),并把每个匹配文件的相对路径名输出到标准输出 (-print)。然而,此命令按这个方式执行的原因,是由每个测试和操作之间的逻辑关系决定的。记住,在每个测试和操作之间会默认应用 -and 逻辑运算符。我们也可以这样表达这个命令,使逻辑关系更容易看出:
因为测试和行为之间的逻辑关系决定了哪一个会被执行,我们可以看出知道测试和行为的顺序很重要。例如,如果我们重新安排测试和行为之间的顺序,让 -print 行为是第一个,那么这个命令执行起来会截然不同:
这个版本的命令会打印出每个文件(-print 行为总是为真),然后测试文件类型和指定的文件扩展名。
xargs
这个 xargs 命令会执行一个有趣的函数。它从标准输入接受输入,并把输入转换为一个特定命令的参数列表。
使用这项技术,我们可以保证所有文件,甚至那些文件名中包含空格的文件,都能被正确地处理。
选项
这些选项被用来控制 find 命令的搜索范围。