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
输出不换行