Linux 文件查找

在Linux系统中,当我们知道某个文件的文件名,但是不知道这个文件的具体路径时。这个时候就需要使用相关工具来进行查找。一般用locate和find这两个工具来进行查找操作。

locate

locate工具不是系统自带的,某些Linux发行版上需要自己手动安装。

locate查询原理
locate通过查询系统上预建的文件索引数据库 /var/lib/mlocate/mlocate.db,然后根据数据库中的信息来找到需要查找的文件,所以依赖数据库中的信息来进行查找。

locate会在系统较为空闲的时候自动构建mlocate.db这个数据库,当然也可以手动执行updatedb来更新数据库

sudo updatedb

locate特点:

  • 依赖于mlocate.db,并非实时查找

  • 查找速度很快,搜索的是文件的全路径

locate常用的选项有以下两个

  • -i: 不区分大小写,通过文件名进行查找的时候默认是区分大小写。

  • -r: 使用基本正则,默认是不适用正则的,只是作为普通字符处理。

例如:查找名称或路径中包含“sshd”的文件

locate sshd

find

find和locate的区别在于find是实时搜索的,通过遍历指定路径来查找文件,而不像locate一样依赖一个数据库来查找。

find 查找功能

find命令的使用格式如下:

find 查找路径 查找条件

指定了查找路径后,会根据查找条件在指定的查找路径下进行查找;

查找条件有很多,以下是一些常用的查找条件

  • 文件名:通过 -name 参数来指定文件名

  • 文件所有者:通过 -user 参数来指定

  • 文件类型:通过 -type 参数指定

  • 文件权限:通过 -perm参 数指定

三个时间作为查找条件:

  • -atime:与文件的访问时间有关。当文件被读取时,其访问时间就会更新。例如使用 cat 命令查看文件的内容会更改文件的访问时间。

  • -mtime:与文件的修改时间有关。当文件的内容发生变化时,其修改时间就会更新。例如,编辑文件的内容会更改文件的修改时间。

  • -ctime:与文件的更改时间有关。这涉及到文件元数据的更改,例如文件权限或所有权的更改。

例如:删除180天以前的文件

# 如果文件创建后其内容从未被更改过,使用mtime(最后修改时间)会与文件的实际创建时间相匹配。此时基于 mtime 来查找和删除文件是合适的

# 默认行为就是逻辑 与,所以可以忽略 -a 选项

find /home/ehigh/html -type f -mtime +180 | xargs rm -f 

例如:查找所有目录下名字叫作 ehighps的文件

find  / -name ehighps

例如:查找文件所有者是tom的文件

find / -user tom

例如:查找文件类型是链接类型的文件

find / -type l

例如:查找权限是777的文件

find / -perm 777

说明:

  1. 查找到了符合条件的文件,都会以绝对路径的形式输出到屏幕上

  2. 如果不指定查找路径,就是默认查找当前路径下符合条件的文件

  3. 根据文件类型查找文件的时候 -type参数后面跟文件类型的缩写(f: 普通文件 、d: 目录文件 、l: 符号链接文件 、s:套接字文件 、b: 块设备文件 、c: 字符设备文件 、p: 管道文件)

  4. 根据文件权限来进行查找的时候,是精确匹配,只有满足条件的才会匹配到

  5. 查询条件可以有多个,通过(-a 与)、(-o 或)、(-not 非)来连接多个匹配条件。默认行为就是逻辑 与,所以可以忽略 -a 选项

处理动作

因为通过find命令查找到符合条件的文件后,默认都是输出到屏幕上的,可以通过一些处理动作来对查找到的文件做进一步的操作。最常见的就是对查找到的文件执行相关命令操作。

需要通过 -exec 参数来指定对文件执行操作的命令,具体格式如下:

-exec COMMAND {} \;

# 件执行COMMAND命令

# \;用于表示命令的结束。

说明:
使用 ; 是原因在许多 shell 中,; 是一个特殊字符,用于分隔多个命令。为了避免 shell 解释这个字符,使用 \ 对其进行转义,使其被当作一个普通字符,从而来表示find命令的结束;

find + xargs

  • 效率: 通过 -exec COMMAND {} \ ;效率没有通过find结合xargs命令高。使用 find -exec 时,对于找到的每一个文件,都会启动一个新的进程来执行指定的命令。如果有数千个文件,那么就会启动数千个进程。而 xargs 可以更有效地批处理这些文件,一次启动一个进程来处理多个文件。

  • 复杂性: 前者更复杂且没有 find + xargs 这种方式简洁

格式:

find 查找路径 查找条件 | xargs 需要做的操作

xargs:
xargs 是一个命令行工具,它的主要目的是从标准输入读取数据,并将这些数据作为参数传递给其他命令,find结合xargs的时候,借助管道符将find原本要输出到屏幕上的内容作为了xargs命令的输入,然后再作为后面具体命令的参数。

例如:查找符合条件的文件进行删除

find /home/ehigh -name test.sh | xargs rm -f

在查找到 test.sh 的路径时,通过管道符会作为 xargs 的输入,因为管道的作用就是将一个进程的输出作为另外一个进程的输入。这个时候 xargs 才将获取到的信息作为rm的参数。所以最终结果就是:

rm -f /path/test.sh

疑问:
管道符已经能实现将一个进程的标准输出作为另外一个进程的标准输入了,为什么还需要xargs呢?

例如:

cat /etc/psswd | grep tom

原因:
因为不是所有的命令都支持从标准输入读取内容作为参数,所以就借助了xargs来读取标准输入内的内容,再转化为后面命令的参数,从而使得许多命令能间接地利用管道的输出。

posted on 2022-06-18 19:22  背对背依靠  阅读(90)  评论(0编辑  收藏  举报