linux 文件查找

来源:互联网 发布:汽车英文翻译软件 编辑:程序博客网 时间:2024/06/09 22:20

locate

查找文件最快速的方法就是使用locate(已被mlocate和slocate取代)命令,它会快速的搜索路径名数据库,输出匹配的文件名称。路径名数据库是由updatedb的程序创建和更新,updatedb位于/usr/bin目录下,由/etc/cron.daily目录下的mlocate执行脚本调用执行。




find命令

locate只能使用文件名来查找文件,最强大的查找文件的方法是使用find命令。find可以通过文件的各种属性来查找文件,例如文件名,文件大小,文件类型等。其中文件的各种查找条件可以通过操作符进行连接,即可以使用多种属性查找文件。


操作符

操 作符                                                                        描述-and如果测试符两边的条件都为真,则匹配,否则舍弃。如果没有使用操作符,那么默认使用and。可以简写成-a。-or
如果操作符两边的任意一个条件为真,那么该文件名匹配,否则让舍弃。可以简写成-o。-not如果操作符后面的条件为真则匹配,可以简写成!()把条件组合起来形成更大的表达式,这用来控制表达式的优先级。默认情况下find按照从左到右的顺序计算。
注:因为圆括号对shell有特殊的含义,所以使用反斜杠转义括号。单个圆括号()中间的内容表示指令群组,shell会产生一个子shell来执行括号中的指令。

find / \( -name "menu" \) -o \( -name "grub" \) >/home/peter/grub_location.txt &


同时表达式执行的时候有一定的规则

expre1的结果操作符           expre2是否执行-and总要执行-and从不执行-or从不执行-or总要执行

条件表达式的执行符合“短路”规则。


预定义的操作
find命令能够根据查找的结果执行指定的操作。
操作       描述-delete删除当前匹配的文件-ls对匹配的文件执行等同于ls -dils命令-print把匹配的文件输送到标准输出,如果没有指定操作,这是默认操作。-quit一旦找到一个匹配,退出!

在find命令使用时,每个操作和测试条件之间会默认使用and连接多个测试条件之间也默认使用and连接

find ~ -name '*.jpg' print  等价于 find ~ -name '*.jpg' -and print

操作的执行也是符合“短路”计算原则。


自定义操作

除了预定义的操作意外,我们可以唤醒随意命令,传统方式是通过exec方式。

-exec command {} ;

command表示的是要执行的指令,{}表示的是当前路径名,分号是命令结束符,表示当前命令的结束。

由于花括号和分号对于shell有特殊含义,所以需要用引号括起来或者转义。

find ~ -type f -name 'foo*' -exec ls -l '{}' ';'


另外可以通过ok替代exec实现交互。

find ~ -type f -name 'foo*' -ok ls -l '{}' ';'



提高效率

使用exec时,每次找到一个匹配的文件,那么就会启动exec后面的命令的一个实例,我们希望执行

ls -l file1 file2 file3

而不是

ls -l file1

ls -l file2

ls -l file3


有两种方法

1.将exec后面的分号改为加好(+)可以把搜索的结果整合为一个参数列表,只需要执行一次操作即可。

2.使用xargs命令,它从标准输入接受输入,并将 输入转换成特定命令的参数列表。

使用第一种方法进行处理时,exec能够接受的命令长度有限制,所以find命令在命令长度过长的情况下会出现溢出错误,错误信息通常是“参数列太长”或“参数列溢出”。这样就需要使用xargs。当find和xargs配合使用的时候,xargs每次获取一部分文件名称而不是全部,然后重复知道耗尽标准输入,执行带有 –show–limits 选项的xargs 命令,来查看命令行的最大值。

find ~ -type f -name 'foo\*' -print | xargs ls -l


当文件名中出现有空格的时候,那么该空格会被当做界定符,参数列表就会出现错误,为解决这个问题,find 命令和 xarg 程序允许可选择的使用一个 null 字符作为参数分隔。一个 null 字符被定义在 ASCII 码中,由数字零来表示(相反的,例如,空格字符在 ASCII 码中由数字 32 表示)。find 命令提供的 -print0 行为,则会产生由null 字符分离的输出,并且 xargs 命令有一个 –null 选项,这个选项会接受由 null字符分离的输入。

find  -iname ‘*.jpg’ -print0 | xargs –null ls -l


使用这项技术,我们可以保证所有文件,甚至那些文件名中包含空格的文件,都能被正确地处理。


参考资料:

特殊符号:http://linux.vbird.org/linux_basic/0320bash.php#settings_wildcard

0 0