linux 文件查找 find 命令详解

时间:2022-08-11 09:20:18

**

find 简介

**
Linux下文件查找常用命令有locate和find命令。locate命令不是实时查找,所以查找的结果不精确,但查找速度很快。因为它查找的不是目录,而是一个数据库(/var/lib/locatedb),这个数据库中含有本地所有文件信息。Linux系统自动创建这个数据库,并且每天自动更新一次,所以使用locate命令查不到最新变动过的文件。为了避免这种情况,可以在使用locate之前,先使用updatedb命令,手动更新数据库。find命令是实时查找,是遍历目录中所有文件完成查找,因此查找结果精确,并且支持众多选项,功能非常强大,但是速度慢。 在遍历一个大的文件系统(30G以上)运行一个非常消耗资源的find命令时,都倾向于把它放在后台执行,下面将重点讲解find 命令。

一 find 命令格式:

find pathname -options [-print -exec -ok …]

1 命令功能:用于在文件树种查找文件,并作出相应的处理
- 命令参数:
pathname: find命令所查找的目录路径,默认为当前路径
-options 文件查找的条件参数
[-print -exec -ok …] 处理动作,默认为显示。
-print: find命令将匹配的文件输出到标准输出
-exec: find命令对匹配的文件执行该参数所给出的shell命令。相应命令的形式为’command’ { } \;,注意{ }和\;之间的空格。
-ok:和-exec的作用相同,只不过以一种更为安全的模式来执行该参数所给出的shell命令,在执行每一个命令之前,都会给出提示,让用户来确定是否执行。

2. find 常用 options选项

name 按照文件名查找文件。
-perm 按照文件权限来查找文件。
-prune 使用这一选项可以使find命令不在当前指定的目录中查找,如果同时使用-depth选项,那么-prune将被find命令忽略。
-user 按照文件属主来查找文件。
-group 按照文件所属的组来查找文件。
-mtime -n +n 按照文件的更改时间来查找文件, - n表示文件更改时间距现在n天以内,+ n表示文件更改时间距现在n天以前。find命令还有-atime和-ctime 选项 ,用法和 -mtime 一样。
-nogroup 查找无有效所属组的文件,即该文件所属的在/etc/groups中不存在。
-nouser 查找无有效属主的文件,即该文件的属主在/etc/passwd中不存在。
-newer file1 ! file2 查找更改时间比文件file1新但比文件file2旧的文件。
-type 查找某一类型的文件,例如:
b - 块设备文件。
d - 目录。
c - 字符设备文件。
p - 管道文件。
l - 符号链接文件。
f - 普通文件。
-depth :使查找在进入子目录前先行查找完本目录
-fstype:查找位于某一类型文件系统中的文件,这些文件系统类型通常可以在配置文件/etc/fstab中找到,该配置文件中包含了本系统中有关文件系统的信息。
-mount:在查找文件时不跨越文件系统mount点。
-follow:如果find命令遇到符号链接文件,就跟踪至链接所指向的文件。
-cpio:对匹配的文件使用cpio命令,将这些文件备份到磁带设备中。

3 find 对搜索结果处理参数

print //默认情况下的动作
-ls //查找到后用ls 显示出来
-ok [commend] //询问用户是否要执行后面的命令
-exec [commend] //查找后执行命令的时候不询问用户,直接执行
注意 :-ok和-exec命令将命令行上后续的参数作为他们参数的一部分,直到被\;序列终止。魔术字符串{}是-ok和-exec命令的一个特殊类型的参数,它将被当前文件的完整路径取代。
-print:默认的处理动作,显示至屏幕
-delete:删除查找到的文件
-fls file:查找到的所有文件的长格式信息保存至指定文件中
{}: 用于引用查找到的文件名称自身
| xargs // xargs 可以用来传递参数,可以对find 后的结果执行特定的命令,这个非常实用而且简洁,个人觉得有了xargs 后 -exec 显得很多余了
find传递查找到的文件至后面指定的命令时,查找到所有符合
条件的文件一次性传递给后面的命令

4 find 使用举例和说明

find -mtime -1 查找一天内被修改的文件
find . -name “*.log” 在当前目录查找 以.log结尾的文件
find /bin -perm 777 查找bin 目录下权限为777 的文件
find /var -type f -name “*.log” | xargs ls -l 找出var 下 .log结尾的文件并且列出列出详细信息
find /root -size +10M -mindepth 2 -maxdepth 4 找出root下大于10M 的文件,从第二层查找,最大目录深度为4 。
find /app ! -type d 查找类型为非目录的文件 (!表示非)
find /app -empty 查找大小为0的文件或空目录
find /home -links +2 查硬连接数大于2的文件或目录
find . -name “[A-Z]*” -pri26nbsp 对匹配的文件使用cpio命令,将他们备份到磁带设备中
find /etc -name “host*” 查以host开头的文件
find /app -name “[a-z][a-z][0–9][0–9].txt” 查以两个小写字母和两个数字开头的txt文件
find /etc/ -perm -007 -exec ls -l {} \; #查所有用户都可读写执行的文件同-perm 777
name ‘*.h’ -exec grep AF_INEF6 {} \; 因grep无法递归搜索子目录,故可以和find相结合使用。 在/usr/include 所有子目录中的.h文件中找字串AF_INEF6
find /app -name “test*” -ok rm {} \; 查找/app 下 test开头的文件或者目录,执行删除命令,并询问用户是否确认删除, 如果是-exec rm 那就直接删除了!
find /data –type f -perm 644 -name “*.sh” –exec
chmod 755 {} \; 查找 data 目录下权限为644 以 文件名以 .sh 结尾的普通文件 然后更改权限为755.
find 命令举例到此结束。