FreezeJ' Blog

Linux find命令

2022-06-15

linux find命令可以根据各种条件查找文件,还可以进一步执行操作。本文记录find一些常用的参数,以及一些常用例子。

本文所用find版本如下:

find --version
find (GNU findutils) 4.5.11

查找条件

可以组合多个查找条件来查找

文件名

# 通配匹配(非正则表达式)
find ./ -name "*.txt"

# 不区分大小写
find ./ -iname "test"

# 正则匹配
find ./ -regex ".*bar."

文件路径

find ./ -path "*123*"

文件类型

find ./ -type f

type可选的类型为:

  • d: 目录
  • f: 文件
  • p: 管道
  • l: 软连接
  • b: 块设备
  • c: 字符设备
  • s: 套接字文件
  • p: 管道文件(pipe)

文件大小

# 查找大于100M的文件
find ./ -size +100M

+表示大于,-表示小于
可选单位:

  • b 512 byte块(默认单位)
  • c 字节(字符个数)
  • w 2字节,词
  • k
  • M
  • G

文件时间

时间(stat)

  • 访问时间 a(Access)
  • 修改时间 m(Modify)
  • 状态改变 c(Change)

单位

  • 分钟 min
  • 天 time

大小

  • 大于 +
  • 小于 -
# 修改时间小于5分钟
find ./ -mmin -5

# 访问时间大于30天
find ./ -atime +30

相对时间

# 比某个文件更新修改
find ./ -newer ./test

# 比某个文件更旧修改(包含本身)
find ./ -not -newer ./test

文件权限

-perm mode 严格匹配
-perm +mode 已弃用的旧方法(建议使用-或/)
-perm /mode 任意匹配
-perm -mode 所有匹配

# 匹配权限等于644的文件
find -perm 644
find -perm u=rw,g=r,o=r

# 匹配所有权限大于或等于644的文件,700不满足条件
find -perm -644
find -perm -u=rw,g=r,o=r

# 匹配任意权限大于或等于644的文件,700满足条件
find -perm /644
find -perm /u=rw,g=r,o=r

-readable 可读
-writable 可写
-executable 可执行

find -readable
find -writable
find -executable

属主属组

-user 用户名
-uid 用户id
-group 用户组
-gid 用户组id

-nogroup 无对应属组
-nouser 无对应属主

空文件或目录

find ./ -empty

# 非空文件
find ./ -not -empty -type f

多条件组合

-a and 逻辑与操作,优先级最高
-o or 逻辑或操作
-not 逻辑非

# 查找文件或文件夹
find ./ -type f -o -type d   

# 查找大于1M小于10M的文件(测试时发现这样写是小于9M,不是10M,有误差)
find ./ -size +1M -a -size -10M  

# 排除路径中带test的文件
find ./ -not -path "*test*"

参数

递归软连接

-P 不递归软连接(默认)
-L 递归软连接

查询深度

最大深度maxdepth

find ./ -maxdepth 1 -type f

最小深度mindepth

find ./ -mindepth 2  -type f

操作

交互式执行

每个操作都需要y,n确认

find . -ok ls -l {} \;                                                                                                                         
< ls ... . > ? 
< ls ... ./t1 > ? y
-rw-r--r-- 1 freeze freeze 0 Jun 15 11:37 ./t1
< ls ... ./t3 > ? y
---------- 1 freeze freeze 0 Jun 15 11:37 ./t3
< ls ... ./t2 > ? y
-rwx------ 1 freeze freeze 0 Jun 15 11:37 ./t2
< ls ... ./t4 > ? y
-rwxrwxrwx 1 freeze freeze 0 Jun 15 11:38 ./t4

# okdir 进入目录执行

执行命令

# 在当前目录下执行
find . -exec echo {} \;

# 进入到匹配目录执行
find . -execdir echo {} \;

# 结合xargs
find . -type f | xargs -I {} ls -l {}

格式化输出

tree /home/freeze/tmp_path   
/home/freeze/tmp_path
├── test1
│   └── 1.txt
└── test2

# 输出绝对路径
find /home/freeze/tmp_path -printf "%p\n"                                                                                                      
/home/freeze/tmp_path
/home/freeze/tmp_path/test1
/home/freeze/tmp_path/test1/1.txt
/home/freeze/tmp_path/test2

# 输出basename
find /home/freeze/tmp_path -printf "%f\n"                                                                                                      
tmp_path
test1
1.txt
test2

# 输出dirname
find /home/freeze/tmp_path -printf "%h\n"                                                                                                      
/home/freeze
/home/freeze/tmp_path
/home/freeze/tmp_path/test1
/home/freeze/tmp_path

# 输出匹配内容路径(不包括绝对路径前缀)
find /home/freeze/tmp_path -printf "%P\n"                                                                                                      

test1
test1/1.txt
test2

其它操作

-delete 删除匹配文件
-ls 同ls,显示文件信息
-fprint file 匹配结果输出到文件
-print0 输出不换行

Tags: Linux