技术文章 > Linux > find查找文件 

find 查找文件

find 在目录中查找文件,沿着目录结构依次向下遍历,匹配符合条件的文件,可以附带执行相应的操作选项,默认的操作结果是打印出符合条件的文件与目录。如果使用该命令时,不设置任何参数,则 find 命令将在当前目录下查找子目录与文件,并且将查找到的子目录和文件全部进行显示。

一、常用命令格式:

find [路径] [匹配条件] [操作选项]
命令解释:
匹配条件参数:
  参 数   描 述
-name按文件名查找文件,文件名在参数后面
-iname根据文件名查找,不区分大小写
-perm按权限查找文件
-user按属主查找文件
-group按属组查找文件
-uid按用户uid查找文件
-gid按用户gid查找文件
-nouser查无有效属主的文件,即/etc/passwd文件中不存在该属主
-nogroup查无有效属组的文件,即/etc/group文件中不存在该属组
atimeaccess time,后跟天数。按文件访问时间查找文件,-n指n天以内,+n指n天以前,n是整数
-mtimemodify time,后跟天数。按文件更改时间查找文件,-n指n天以内,+n指n天以前,n是整数
-ctimechange time,后跟天数。按文件属性改变时间查找文件,如文件的权限、属主、属组等,-n指n天以内,+n指n天以前,n是整数
-aminaccess time,后跟分钟数。按文件访问时间查找文件,-n指n分钟以内,+n指n分钟以前,n是整数
-mminmodify time,后跟分钟数。按文件更改时间查找文件,-n指n分钟以内,+n指n分钟以前,n是整数
-cminchange time,后跟分钟数。按文件属性改变时间查找文件,如文件的权限、属主、属组等,-n指n分钟以内,+n指n分钟以前,n是整数
-newer以文件更改时间作为范围查找文件,用法:-newer f1 !f2 表示查找文件更改时间比文件f1新,但比文件f2旧的文件
-type按文件类型查找文件,文件类型有f/d/l/b/c/p/s,分别是普通文件/目录/链接文件/块设备文件/字符设备文件/管道文件/套接字,socket文件
-size按文件大小查找文件,单位有cwbkMG,c:字节、w:字 (2字节)、b:代表 512 位元组的区块(如果用户没有指定后缀,则默认为 b)、k:表示 kilo bytes (1024字节)、M:兆字节(1048576字节)、G:千兆字节 (1073741824字节)
-depth目录层数(深度),在查找文件时,首先查找当前目录中的文件,然后再在其子目录中查找,当指定-delete行为时,会自动应用这个选项。
-fstype查位于某一类型文件系统中的文件,这些文件系统类型通常可 在/etc/fstab中找到
-mount查文件时不跨越文件系统mount点
-follow如果find命令查找遇到符号链接文件,就跟踪至链接所指向的文件
-cpio对匹配的文件使用cpio命令,将这些文件备份到磁带设备中
-path指定字符串作为寻找目录的范本样式
-prune使用这一选项可以使find命令不在当前指定的目录中查找,如果同时使用了- depth选项,那么-prune选项将被find命令忽略,由于-delete暗含-depth,因此无法有效地同时使用-prune和-delete
-empty搜索空文件或空目录
-maxdepth查找最大目录层数(最大深度),如:-maxdepth 1,即只查找一层目录
-mindepth查找最小目录层数(最小深度)
操作选项:
参数描 述
-print将用 find 命令找到的文件输出到标准输出,格式为每列一个名称,每个名称之前皆有 "./" 字符串,如果查找出来的文件太多,建议使用此参数
-print0文件或目录名称列出到标准输出,格式为全部的名称皆在同一行
-printf将文件或目录名称列出到标准输出。格式可以自行指定,命令格式: -printf <输出格式>
-fprint此参数的效果和指定 "-print" 参数类似,但会把结果保存成指定的列表文件,命令格式: -fprint <列表文件>
-fprint0此参数的效果和指定"-print0"参数类似,但会把结果保存成指定的列表文件,命令格式 :-fprint0 <列表文件>
-fprintf此参数的效果和指定 "-printf" 参数类似,但会把结果保存成指定的列表文件,命令格式 :-fprintf <列表文件> <输出格式>
-ls对匹配的文件执行 ls -dils 命令,并且将结果发送到标准输出
-quit查找到一个立刻退出
-delete删除当前匹配的文件
-used查找文件或目录被更改之后在指定时间曾被存取过的文件或目录,单位以日计算,命令格式:-used <天数>
-exec对 find 命令所匹配到的文件执行该参数所给出的 shell 命令,命令格式为:-exec 命令 {} \; ,注意大括号要与 \ 保持空格,最后面是以 ; 结尾
-ok和 -exec 的作用相同,不同的是 -ok 以一种更为安全的模式来执行该参数所给出的 shell 命令,在执行每一个命令之前,都会给出提示,让用户来确定是否执行,如果需要执行,用户输入 y,然后回车即可
| xargs这里本来不想加入 | 的,但是 xargs 一般都是与 | 一起使用的。与 -exec 作用相同 ,但是为什么有 -exec 了还要 | xargs 呢?原因是:
  • ① 在使用 find 命令的 -exec 选项处理匹配到的文件时, find 命令将所有匹配到的文件一起传递给 exec 执行。但有些系统对能够传递给 exec 的命令长度有限制,这样在 find 命令运行几分钟之后,就会出现溢出错误。错误信息通常是“参数列太长”或“参数列溢出;
  • ② exec是要等 find 命令执行完成之后才对 find 执行完成的结果进行操作,然而很不幸的是当文件太多的时候会出现文件队列过长的提示,这是应为 linux 有个临时内存地址只保存 128K 的数据,我们有个服务器目录中有超量的文件例如 1 万份文件,,要对其进行分类,使用 exec 就不行,这时候就需要用到 xargs;
  • ③ 管道实现的是将前面的 stdout (标准输出)作为后面的 stdin (标准输入),但是有些命令不接受管道的传递方式,最常见的就是 ls 命令。有些时候命令希望管道传递的是参数,但是直接用管道有时无法传递到命令的参数位,这时候需要 xargs , xargs 实现的是将管道传输过来的 stdin 进行处理然后传递到命令的参数位上。也就是说 xargs 完成了两个行为:处理管道传输过来的 stdin ;将处理后的传递到正确的位置上,而且 xargs 的作用不仅仅限于简单的 stdin 传递到命令的参数位,它还可以将 stdin 或者文件 stdin 分割成批,每个批中有很多分割片段,然后将这些片段按批交给 xargs 后面的命令进行处理,这也就是为什么 xargs 命令一般与管道连用的原因了。

二、实例

#查找/etc/目录下文件名为passwd的文件
find /etc/ -name passwd -print

#查找/etc/目录下文件名以.conf文件结尾的文件
find /etc/ -name *.conf -print | more

#查找/etc/目录下文件权限为444的文件
find /etc/ -perm 444 -print |xargs ls -l | more

#给/mnt下文件权限包含404的文件的g位加w的权限
find /mnt -perm 404 -exec chmod g+w {} \;

#查找/mnt/目录下文件的属主与属组都为ops的文件(逻辑关系默认为并且,-a 表示并且(与),-and的简写
find /mnt/ -user ops -a -group ops -print

#查找当前目录当天修改过的文件(列出了两种方法)
find ./ -mtime -1 -type f -print |xargs ls -l
find ./ -mtime -1 -type f -exec ls -l {} \;

#查找当前目录当天修改过的文件并询问是否要显示
find ./ -mtime -1 -type f -ok ls -l {} \;

#在/mnt/目录下查找更改时间在5日以前的文件并删除它们(列出了两种方法)
find ./ -type f -mtime +5 -exec rm {} \;
find ./ -type f -mtime +5 delete;

#按文件类型查找文件:f普通文件,d目录,l链接文件,b块设备文件,c字符设备文件,p管道文件,s套接字socket文件
find /dev -type f -print

#查找/mnt目录下文件大小为20k的文件,数字前-小于、+大于,单位c字节、M兆字节、G千兆字节
find /mnt/ -size 20k -print

#查找比tmp.txt新,比temp.txt旧的文件
find ./ -newer 'tmp.txt' ! -newer 'temp.txt' -type f -print -ls | more

#找出当前目录下所有空目录
find ./ -type d -empty

三、find 命令格式化输出

几个常用的输出格式(想要知道更多可以使用man find命令查看): 查找当前目录以及主目录下所有以.txt结尾的文件,并且格式化输出最终只输出文件名,也不输出路径:
find ./ -name "*.txt" -printf "%f\n"


来源:摘自https://blog.csdn.net/weixin_44901564/article/details/112941038,本站 行痴 整理,2023-08-21