Linux 查找文件工具find

2024-06-21 16:18
文章标签 工具 linux 查找文件 find

本文主要是介绍Linux 查找文件工具find,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

 

find命令是从指定位置进行遍历查找(可以理解为对文件和目录进行逐一查找)

find可以查找具有某一类特征的文件(例如查找具有某个权限特征的文件等),非常适合于批量处理具有某一类特征的文件

 

###################################################################

 

命令格式

# find [path] [expression]

参数意义如下:

path:find查找路径。如果为指定,则默认为当前工作目录

Expression:用于定义find查找的表达式,表达式通常由选项、测试和动作3类参数组成

 

选项用于指定find查找的目录、帮助等信息

常用选项极其含义如下

 

选项

说明

help

获得find命令的帮助信息

depth

先从当前目录中查找,然后再从当前目录短的子目录中查找

maxdepth LEVELS

向下搜索到第LEVELS层目录,当LEVLES=0时表示只在当前目录查找

mindepth LEVELS

至少向下搜索LEVELS层目录

mount

不搜索远程文件系统(搜索远程文件系统将花费大量的网络资源)

follow

搜索如果遇到链接文件就连同链接所指向的文件一并检查

 

大多数情况下,Linux管理员更像搜索到具有某一类特征的文件,这时表达式应当使用一些测试参数测试参数是一些使得输出更加详细的参数。

 

常用的测试参数及含义如下

 

测试

说明

name

按文件名查找

perm

按文件权限查找

type

查找某一类型的文件

mtime+n-n

按文件修改的时间查找,+n表示修改时间据现在n天以前,-n表示修改时间据现在n天以内

atime+n-n

按文件的访问时间查找文件(使用方法与mtime参数相同)

size n[c]

查找文件长度为n块的文件,c表示文件大小为n字节的文件

User

按文件属主查找

group

按文件属组查找

nouser

查找没有有效属主的文件(文件属主在/etc/passwd文件中不存在)

nogroup

查找没有有效属组的文件(文件属组在/etc/group文件中不存在)

 


动作参数指定find命令如何查找和处理查找的文件,常用的动作有如下4种:

 

prune:不在指定目录中查找

print:将查找到的文件输出到标准输出

exec:对查找到的文件执行exec动作后附带的Shell命令

ok:对查找到的文件执行ok动作后附带的Shell命令,在每次执行前将提示用户是否执行

 

find有许多参数,大多数情况下,使用该命令都至少要包含一个测试和一个动作,才能完成整个查找任务。

 

################################################################

 

按文件名称查找

 

有时候管理员会忘记某一个文件存放在社么位置。可以使用name参数进行查找,也可以使用文件名称通配符配合查找

1.使用name参数指定要查找的文件名,并使用print参数将找到的文件输出

想要在/etc目录下查找Samba服务的配置文件smb.conf

#find /etc -name "smb.conf" -print

2.使用name参数时,配合文件名通配符查找文件

想要查找/etc目录下所有的配置文件

#find /etc -name "*.conf" -print

3.如果未指定查找的目录,find将在当前目录中查找

在当前目录中查找名为messages的文件

#find -name "messages" -print

4.查找前两个字符是小写字母,第3个字符是数字,后面是.d的文件

如果想要在/etc查找两个小写字母加一个数字,最后面是.d的文件,可以使用下面这条命令

#find -etc -name "[a-z][a-z][0-9].d" -print

5.使用find命令查找文件时,使用操作符&将其放到后台进行

在一个很大的文件系统上进行查找时,可能会花费很多时间,通常建议使用操作符&将find命令放到后台执行

#find / -name "*.conf" -print &

 

###########################################################

 

按文件权限查找

 

使用perm参数可以按照文件的权限进行查找,使用此参数时,需要使用八进制表示权限。按权限查找文件通常用在多用户系统中,以便于发现可能导致泄密、不安全的内容等。

note:使用八进制表示权限的方法称为绝对模式,绝对模式使用数字4表示读权限,2表示写权限,1表示执行权限,使用多权限时只需要将数值相加即可。使用3位数字表示多用户权限,从左到右分别表示文件属主、属组和其他用户权限。

 

1.在整个文件系统上查找属主可以读、写,属组可以读、写,其他用户可以读的文件:

在整个文件系统上查找权限为664的文件

#find / -perm 664 -print

2.在当前目录的file子目录下查找其他用户可以读、写、执行的文件(这种情况下应当引起重视),此时应该在权限数值前加一个横杠“-”(“-”表示使用包含模式)

在当前目录的file子目录中查找权限中包含其他用户可以读、写、执行的文件

#find ./file -perm -007 -print

 

#########################################################3

 

按文件类型查找

 

用type参数可以按类型查找文件,常见的文件类型有目录、字符设备文件和普通文件等。按文件类型进行查找适合于一些比较特殊的情况,例如要查找某个设备而不知道其具体的名称等

1.查找/dev下有哪些字符设备,其中c表示字符设备

# find /dev -type c -print

2.查找目录/dev中的块设备文件,其中b表示块设备文件

#find /dev -type b -print

3.查找目录/etc/rc3.d中除了链接文件以外的文件(通常情况下这个目录下只会存放链接文件),其中l表示链接文件,感叹号!表示否定

#find /etc/rc3.d ! -type l -print

 

note:参数type使用的文件标识除普通文件使用f作为标识外,其他标识都与ls命令的长格式中的文件类型标识一致,例如使用字母d表示目录,l表示链接文件等

 

############################################################33

 

按文件的时间戳记和大小查找

 

在管理和维护Linux系统的过程中,经常需要清理一些过期的日志和文件,清理这些文件的标准通常是文件的修改时间、访问时间、文件的大小等。而另一种情况是我们需要知道一定时间内被修改过的文件,以便对这些文件进行备份等。这时可以使用find命令的mtime、atime和size参数按文件的时间戳记和文件的长度查找

 

1.按时间戳记查找文件

按文件的时间戳记进行查找时,可以使用+n限定时间在n天以前,使用-n限定时间在n天以前。虽然也可以使用n精确限定时间,但一般不这样使用,原因是系统计算时间是以秒为计算单位的,因此一般情况下该选项无法得到任何有用的结果。

1.1使用-7指定修改时间在7天以内的文件

希望在整个文件系统上查找修改时间在一周以内的文件

#find / -mtime -7 -print

 

1.2使用+1指定修改时间在1天以前的文件

查找用户根目录下修改时间在1天以前的文件

#find ~ -mtime +1 -print

 

1.3查找目录/data中访问时间在10天以内的文件

查找目录/data中访问时间在10天以内的文件

#find /data -atime -10 -print

 

2.按文件长度查找文件

使用size按文件大小查找时,可以像按时间戳记那样使用+n表示文件长度大于n的文件,-n表示文件长度小于n的文件。

默认情况下文件长度的单位是块(一块等于512字节)如果要以字节来计算文件长度,应该在数字后加上小写字母c

2.1使用+10000000c表示文件长度大于10MB的文件

当前目录下查找文件长度大于10MB的文件

#find . -size +10000000c -print

 

2.2使用-30表示文件长度小于30块(512*30=15KB)的文件

要在当前目录下查找文件长度小于30块的文件

#find . -size -30 -print

 

note:在按文件大小查找文件时,也可以使用KB(千字节)、MB(兆字节)、GB(吉字节)等较大的单位标志文件的大小。

 

#################################################################33

 

按文件属主或属组查找

当管理员将一个用户或用户组从系统中删除时,可能需要将该用户或用户组的文件收集起来保存一段时间。这时可以使用find命令的user、nouser、group和nogroup这几个参数,查找指定用户、用户组的文件。

1.使用user参数查找属主为lilei的文件

要查找目录/home中属主为lilei的文件

#find /home -user lilei -print

 

2.使用nouser参数查找没有有效属主的文件

在整个文件系统上查找出没有有效属主(即用户名在系统用户名/etc/passwd中不存在)的文件

#find / -nouser -print

 

3.使用group参数查找属组为admin的文件

查找目录/file中属组为admin的文件

#find /file -group admin -print

 

4.使用nogroup参数查找没有有效属组的文件

在整个文件系统中查找没有有效属组(即用户组名称在系统用户组文件/etc/group中不存在)的文件

#find / -nogroup -print

 

###############################################3

 

在find命令中还存在一些其他参数,这些参数使用频率较低(例如忽略某个目录),但有时使用这些参数查找文件却十分方便。

1.忽略目录参数prune

在查找文件的时候,可能不需要查找某个目录,或用户已经知道某个目录中不存在这个文件,这时就可以使用prune参数忽略这些目录。

例如要从除了/etc以外的整个文件系统上查找以.conf结尾的文件

使用path、prune和name参数指定在除了/etc以外的整个目录中查找以.conf结尾的配置文件

#find / -path "/etc" -prune -o -name "*.conf" -print

在上面的示例中,使用参数o将两个不同的参数连接起来

 

###################################################

 

使用exec和ok处理查找到的文件

在Linux管理和维护中,大多数时候查找具有某一类特征的文件的目的是为了处理这些文件,通常的处理方式有删除、移动等,例如查找并删除一些旧的文件或过期的日志等,这时可以使用动作参数中的exec、ok,这两个参数都可以对查找到的文件执行Shell命令,不同的是,使用ok参数执行较危险的Shell命令(例如删除文件命令rm)时会提示用户

利用find命令查找到文件后,就可以使用exec、ok参数对查找到的文件执行Shell命令。使用exec、ok参数执行Shell命令的格式如下:

#-exec [Shell 命令] {} \;

#-ok [Shell命令] {} \;

在上面的格式中,参数exec、ok后面空一格紧跟要执行的Shell命令,再空一格后面是一个大括号“{}”,最后加上一个反斜杠“\”和一个分号";"

1.查找当前目录的backup_sys子目录中,修改时间据现在一周以前、以message开头的文件,并用ls -l命令查看:

#find ./backup_sys -name "message" -mtime +7  -exec ls -l {}\;

ls命令列出的文件是相对于当前目录的相对路径

 

2.查找并删除两周以前的备份文件

#find ./backup_sys -name "message*" -mtime +14 -exec rm {}\;

 

3.如果要在执行Shell命令时获得命令执行的提示,可以使用ok参数。例如删除两周以前的备份文件并在执行前获得提示

#find ./backup_sys -name "message*" -mtime +14 -ok rm {}\;

 

############################################################

 

使用xargs命令处理查找到的文件

利用exec和ok参数查找到的文件时,存在一些缺陷,这些缺陷如下:

系统对参数exec、ok传递给Shell命令的文件列表长度有一定的·限制。当find命令查找到的文件数量很多时,会出现参数列表溢出错误。

参数对find命令找到的每一个文件发起一个相应的处理进程,当find命令查找到的文件数量很多时,可能会影响整个系统性能。

 

xargs命令的作用是构造一个参数列表并交给命令执行。与参数exec、ok相比,xargs不会一次获取并处理find找到的所有文件,而是每次只获取并处理其中的一部分。处理完后在获取下一部分,直至结束。这个过程xargs都只发起一个处理进程,对系统性能的影响很小。

 

使用xargs命令分割参数列表时,需要借助于管道。

例如查找当前目录的backup_sys子目录时,修改时间据现在两周以前的所有文件并删除:

#find ./backup_sys -name "message*" -mtime +14 -print | xargs rm

这条命令首先使用find查找出相应的文件。然后使用管道传递给xargs,xargs命令构造参数列表之后再传递给rm命令执行删除操作

 

 

 

这篇关于Linux 查找文件工具find的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1081703

相关文章

linux-基础知识3

打包和压缩 zip 安装zip软件包 yum -y install zip unzip 压缩打包命令: zip -q -r -d -u 压缩包文件名 目录和文件名列表 -q:不显示命令执行过程-r:递归处理,打包各级子目录和文件-u:把文件增加/替换到压缩包中-d:从压缩包中删除指定的文件 解压:unzip 压缩包名 打包文件 把压缩包从服务器下载到本地 把压缩包上传到服务器(zip

高效录音转文字:2024年四大工具精选!

在快节奏的工作生活中,能够快速将录音转换成文字是一项非常实用的能力。特别是在需要记录会议纪要、讲座内容或者是采访素材的时候,一款优秀的在线录音转文字工具能派上大用场。以下推荐几个好用的录音转文字工具! 365在线转文字 直达链接:https://www.pdf365.cn/ 365在线转文字是一款提供在线录音转文字服务的工具,它以其高效、便捷的特点受到用户的青睐。用户无需下载安装任何软件,只

Linux 网络编程 --- 应用层

一、自定义协议和序列化反序列化 代码: 序列化反序列化实现网络版本计算器 二、HTTP协议 1、谈两个简单的预备知识 https://www.baidu.com/ --- 域名 --- 域名解析 --- IP地址 http的端口号为80端口,https的端口号为443 url为统一资源定位符。CSDNhttps://mp.csdn.net/mp_blog/creation/editor

【Python编程】Linux创建虚拟环境并配置与notebook相连接

1.创建 使用 venv 创建虚拟环境。例如,在当前目录下创建一个名为 myenv 的虚拟环境: python3 -m venv myenv 2.激活 激活虚拟环境使其成为当前终端会话的活动环境。运行: source myenv/bin/activate 3.与notebook连接 在虚拟环境中,使用 pip 安装 Jupyter 和 ipykernel: pip instal

Linux_kernel驱动开发11

一、改回nfs方式挂载根文件系统         在产品将要上线之前,需要制作不同类型格式的根文件系统         在产品研发阶段,我们还是需要使用nfs的方式挂载根文件系统         优点:可以直接在上位机中修改文件系统内容,延长EMMC的寿命         【1】重启上位机nfs服务         sudo service nfs-kernel-server resta

【Linux 从基础到进阶】Ansible自动化运维工具使用

Ansible自动化运维工具使用 Ansible 是一款开源的自动化运维工具,采用无代理架构(agentless),基于 SSH 连接进行管理,具有简单易用、灵活强大、可扩展性高等特点。它广泛用于服务器管理、应用部署、配置管理等任务。本文将介绍 Ansible 的安装、基本使用方法及一些实际运维场景中的应用,旨在帮助运维人员快速上手并熟练运用 Ansible。 1. Ansible的核心概念

Linux服务器Java启动脚本

Linux服务器Java启动脚本 1、初版2、优化版本3、常用脚本仓库 本文章介绍了如何在Linux服务器上执行Java并启动jar包, 通常我们会使用nohup直接启动,但是还是需要手动停止然后再次启动, 那如何更优雅的在服务器上启动jar包呢,让我们一起探讨一下吧。 1、初版 第一个版本是常用的做法,直接使用nohup后台启动jar包, 并将日志输出到当前文件夹n

[Linux]:进程(下)

✨✨ 欢迎大家来到贝蒂大讲堂✨✨ 🎈🎈养成好习惯,先赞后看哦~🎈🎈 所属专栏:Linux学习 贝蒂的主页:Betty’s blog 1. 进程终止 1.1 进程退出的场景 进程退出只有以下三种情况: 代码运行完毕,结果正确。代码运行完毕,结果不正确。代码异常终止(进程崩溃)。 1.2 进程退出码 在编程中,我们通常认为main函数是代码的入口,但实际上它只是用户级

【Linux】应用层http协议

一、HTTP协议 1.1 简要介绍一下HTTP        我们在网络的应用层中可以自己定义协议,但是,已经有大佬定义了一些现成的,非常好用的应用层协议,供我们直接使用,HTTP(超文本传输协议)就是其中之一。        在互联网世界中,HTTP(超文本传输协议)是一个至关重要的协议,他定义了客户端(如浏览器)与服务器之间如何进行通信,以交换或者传输超文本(比如HTML文档)。