Linux文件查找find

列出文件夹下所有内容(包括目录、文件和子目录中内容,深度优先遍历):

find . 文件夹名

以上方法打印出来文件是以换行符分隔,可以连着打印而不分隔,当文件名中有换行符时用:

find . 文件夹名 -print0

根据名字查找文件:

find . 目录名 -name "文件名"

以上命令中目录名为要搜索的目录,文件名可以用通配符搜索,如果要同时搜索多个文件名,可以用"\( -name 文件名 -o -name 文件名 \)"代替文件名。-name选项有一个变形是-iname,-iname可以在匹配时不区分大小写。
可以匹配整体路径代替文件名:

[student@myhost e]$ find . -path "*b*" 
./a/a.b
./b

以上命令会匹配出目录下的带有hhh的路径如:/ddd/hhh或/ttt/hhh.txt。
find也可以用正则表达式形式匹配名字:

[student@myhost ~]$ find . -regex ".*\(\.txt\|\.log\)$" 2>/dev/null
./.mozilla/firefox/44ud8utl.default/revocations.txt
./.mozilla/firefox/44ud8utl.default/SiteSecurityServiceState.txt

以上命令中若是用参数-iregex则匹配时忽略大小写。
find也可以使用否定参数:

[student@myhost a]$ find . ! -name *.a
.
./a.b

我们也可以限制find命令搜索的目录深度:

[student@myhost e]$ ls a/a.a
a/a.a
[student@myhost e]$ find . -maxdepth 1 -name a.a     #我们限制了深度为1,即为当前目录,找不到a目录下的a.a文件

[student@myhost ~]$ ls e/a.a  e/a/a.a
e/a.a  e/a/a.a
[student@myhost ~]$ find e -mindepth 2 -name a.a     #限制了深度为2,当前目录中a.a文件未找到
e/a/a.a   

以上限定目录深度的参数应该出现在所有参数的前面位置,如果-type选项在深度限制参数前,find命令会先找到所有指定type的文件,再筛选出指定层数的文件,影响效率。
列出所有目录:

find . -type d

-type选项跟空格d代表目录,以下为更多type参数及含义:

参数含义
d目录
f普通文件
l符号链接
c字符设备
b块设备
s套接字
pFIFO

根据时间搜索:
每个Unix/Linux文件中都有三种时间戳:
访问时间(-atime):最后一次访问文件的时间。
修改时间(-mtime):最后一次修改文件的时间。
变化时间(-ctime):元数据(如权限、所有权)最后一次变化的时间。
以上三种参数用整数作参数,还可用+、-控制大于小于:

find . -type f -ctime -7    #找出当前目录下七天内变化过的文件
find . -type f -ctime 7    #找出当前目录下恰好七天前变化过的文件
find . -type f -ctime +7    #找出当前目录下超过七天变化过的文件

也有基于分钟的参数:
访问时间(-amin)
修改时间(-mmin)
变化时间(-cmin)
找出比指定文件更新被修改过的文件:

[student@myhost ~]$ touch z
[student@myhost ~]$ touch x
[student@myhost ~]$ find . -newer z
.
./x

根据大小查找文件:

find . -type f -size +2k    #找出比2kb大的文件

单位大小选项有:

选项大小
b块(512字节)
c字节
w字=2*c
kKB
MMB
GGB

删除find到的文件:

[student@myhost c]$ touch a
[student@myhost c]$ touch b
[student@myhost c]$ find . -newer a -delete
[student@myhost c]$ ls
a

以上命令我们看到-delete选项删除了比a更新被修改过的文件(包括目录,因为没加-type f选项)。
根据权限匹配文件可用-perm选项:

[student@myhost c]$ ll
total 0
-rw-rw-r--. 1 student student 0 Jan 26 16:31 a
[student@myhost c]$ find . -type f -perm 664
./a

根据文件主人搜索:

[student@myhost c]$ find -type f -user student
./a

以上用户名可用UID代替。
有时候,我们希望对find到的文件做一些操作比如修改权限:

[root@myhost c]# ll
total 0
-rw-rw-r--. 1 student student 0 Jan 26 16:31 a
[root@myhost c]# find . -name a -exec chown root {} \;
[root@myhost c]# ll
total 0
-rw-rw-r--. 1 root student 0 Jan 26 16:31 a

-exec选项即可对找到的文件进行操作,以上命令中,对找到的文件进行chown操作,{}代表find出来的文件。
另一个例子:

[root@myhost c]# find . -type f -name *.a -exec cat {} \; > all.a

以上例子含义为找到当前目录及其子目录下所有.a文件并集中到all.a中。
又另一个例子:

[root@myhost c]# find . -type f -mtime +10 -exec cp {} old \;

以上命令可以将当前目录及其子目录下所有十天前修改过的文件移动到old文件夹里。
又另一个例子:

[root@myhost c]# find -type f -name *.txt -exec printf "Text file:%s\n" {} \;

以上命令可以将当前目录及其子目录下所有txt文件名打印出来。
注意:-exec只能接受一个命令,但我们可以把想执行的命令做成一个脚本,将{}放到参数位置即可:

-exec /home/student/commands {} \;

让find命令搜索时跳过某些文件夹:

[student@myhost e]$ ls a/a.a a.a
a.a  a/a.a
[student@myhost e]$ find . \( -name a -prune \) -o \( -type f -name a.a -print \)
./a.a

以上命令中,-prune选项可以排除目录,-o具有短路性即当搜索的目录为a时即为假时不执行之后的语句,后面的语句中-print不可省略。

posted @   epiphanyy  阅读(29)  评论(0编辑  收藏  举报  
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示