有时可能需要在系统中查找具有某一特征的文件,这样做的原因可能有很多,可能是出于安全性的考虑,或者是一般性的系统管理任务,或许是为了找出一个不知保存在什么地方的文件。find是一个非常有效的工具,它可以遍历当前目录甚至整个文件系统来查找某些文件或目录。
在运行一个非常消耗资源的find命令时,很多人都倾向于把它们放在后台执行,因为遍历一个大的文件系统可能会花费很长的时间
1.find命令的一般形式为:
find pathname -options [-print -exec -ok]
pathname :find命令所查找的目录路径。例如.表示当前目录,/表示系统根目录
print: find命令将匹配的文件输出到标准输出
exec: find命令对匹配的文件执行该参数所给出的shell命令,相应命令的形式为'command' {} \;,注意{}和\;之间的空格
ok 和-exec: ok 和-exec的作用相同,只不过以一种更为安全的模式来执行参数所给出的shell命令,在执行每一个命令之前都会给出提示,让用户来确定是否执行。
2.find命令选项
find命令有很多选项或表达式,每一个选项前面跟一个横杠-
-name 按照文件名查找文件
-perm 按照文件权限来查找文件
-prune 使用这一选项可以使find命令不在当前指定的目录中查找,如果同时使用了-depth选项,那么-prune选项将被find命令忽略
-user 按照文件属主来查找文件
-group 按照文件所属的组来查找文件
-mtime -n +n 按照文件的更改时间来查找文件,-n表示文件更改时间距现在n天以内,+n表示文件更改时间距现在n天以前,find命令还有-atime和-ctime选项,这个就不在介绍了。
-nogroup 查找无有效属组的文件
-nouser 查找无有效属主的文件
-newer file1 !file2 查找更改时间比file1新但比文件file2旧的文件
-type 查找某一类型的文件
-size n[c]查找文件长度为n块的文件,带有c时表示文件长度以字节计
-depth 查找文件时,首先查找当前目录中的文件,然后再在其子目录中查找
-fstype 查找位于某一类型文件系统中的文件,这些文件系统类型通常可以在配置文件/etc/fstab中找到,该配置文件包含了本系统中有关文件系统的信息
-mount 在查找文件时不跨越文件系统mount点
-follow 如果find命令遇到符号链接文件,就跟踪至链接所指向的文件
-cpio 对匹配的文件使用cpio命令,将这些文件备份到磁带设备中
3.实例
1.find . -name "[a-z][a-z][0-9][0-9].txt"
在当前目录中查找文件名以两个小写字母开头,跟着两个数字,最后是 .txt的文件
2.find . -perm 775
在当前目录下查找权限为775的文件
3.find /usr -name "/usr/local" -prune test
在usr目录下查找文件,但不在/usr/local目录下查找
4.find . -user test
在当前目录下查找文件属主为test的文件
5.find /home -nouser
在home目录下查找无有效属主的文件
6.find /usr/local -group test
在usr/local目录下查找属于test组的文件
7.find / -mtime -5 和 find / -mtime +5
在系统根目录下查找更改时间在五日以内的文件和更改时间在五天以前的文件
8.find . -newer test1 ! -newer test2 -exec ls -l {} \;
在当前目录下查找比test1新但是比test2旧的文件
9.find . -newer test3
在当前目录下查找比test3新的文件
10.find /etc -type d 和find /etc !-type d
在/etc目录下查找所有的目录和在/etc目录下查找除目录以外的所有类型的文件
11.find . -size +1000000c
在当前目录下查找文件长度大于1M字节的文件
find . -size 1000000c
在当前目录下查找文件长度等于1M字节的文件
find . -size +10
在当前目录下查找文件长度超过10块的文件(一块等于512字节)
12.find / -name "config.ini" -depth
从文件系统根目录开始,查找名为config.ini的文件,它将匹配所有的文件,然后进入子目录中查找。
13.find . -name "*.ini" -mount
在当前的文件系统中查找文件,不进入其他文件系统,可以使用find命令的mount选项
在当前目录查找位于本文件系统中文件名以.ini结尾的文件
14.使用cpio选项
cpio命令可以用来向磁带设备备份文件或从中恢复文件,可以使用find命令在整个文件系统中查找文件,然后用cpio命令将其备份到磁带上
如果希望使用cpio命令备份/etc /home目录中的文件,可以使用如下命令
find etc home -depth|cpio -ivcdC65536 -o /dev/rmt0
在上面的例子中,应当注意到路径中缺少/,这叫做相对路径,之所以使用相对路径,是因为从磁带中恢复这些文件的时候,可以选择恢复文件的路径,如果备份时,使用了绝对路径,比如/etc,那么恢复时,就只能恢复到/etc目录中去
命令解释:find命令首先进入/etc,目录,然后是/home目录,先匹配这些目录下的文件,然后再匹配其子目录中的文件,所有这些结果通过管道传递给cpio命令进行备份。cpio使用了C65536选项,可以使用B选项,不过这样块大小只有512字节,而是用了C65536选项后,块的大小变成了64K字节
使用exec或ok来执行shell命令
当匹配到一些文件以后,可能希望对其进行某些操作,这时就可以使用-exec选项,一旦find命令匹配到了相应的文件,就可以使用-exec选项中的命令对其进行操作,大多数用户使用这一选项是为了查找旧文件并删除它们
exec选项后面跟着要执行的命令,然后是一对{},一个空格和一个\,最后是一个分号
xargs
在使用find命令的-exec选项处理匹配到的文件时,find命令将所有匹配到的文件一起传递给exec执行,不幸的是,有些系统对能够传递给exec的命令长度有限制,这样在find命令运行几分钟之后,就会出现溢出错误,错误信息通常是“参数列太长”或“参数列溢出”,这就是xargs命令的用处所在,特别是与find命令一起使用。find命令将匹配到的文件传给xargs命令,而xargs命令每次只获取一部分文件而不是全部,不想-exec选项那样,这样它可以先处理最先获取的一部分文件,然后是下一批,并如此继续下去,在有些系统中,使用-exec选项会为处理每一个匹配的文件而发起一个相应的进程,并非将匹配到的文件全部作为参数一次执行,这样在有些情况下就会出现进程过多,系统性能下降的问题,因而效率不高,而使用xargs命令则只有一个进程,另外,在使用xargs命令时,究竟是一次获取所有的参数,还是分批获取参数,以及每一次获取参数的数目都会根据该命令的选项及系统内核中相应的可调参数来确定。
find / -type f |xargs file
查找系统中的每一个普通文件,然后使用file命令来测试它们分别属于哪类文件