find

linux中find命令详解。对于使用各种条件来查找文件,该命令非常的重要,而且还能使用-exec参数,附加命令,(跟xargs很像),完成更多的功能。

类似于资源管理器中的查找功能。

资源

正文

通用说明

数字,+号代表 大于,-号代表小于。如: find -mtime -10,表示查找修改在10天以内的文件。具体的数字,代表的是那1天。

  • atime: 显示上一次读取或访问文件的时间。
  • amin: 显示上一次读取或访问文件是多少分钟之前
  • mtime: 显示文件或程序上一次修改文件的时间。更改或修改文件内容时,mtime也会更改。“修改”是指将某些数据附加到文件中,部分或全部重新组织或删除。
  • mmin: 显示几分钟内最后一次修改文件的时间。
  • ctime: 显示文件属性何时修改的

exec

find . -name "*.sh" -exec cat {} \;
find . -name "*.txt" -exec echo   {}  {} \; # 出现两次也是可以的。

说明:

-exec参数后面跟的是command命令,它是以 ; 为结束标志,由于各个系统中分号会有不同的意义,因此在前面加上反斜杠。{} 代表前面find查找出来的文件名

关于分号的说明:避免其成为find的结束标志,其只是 -exec 的内容一部分,即结束标志,而且是不可或缺的。

# 查找目录并列出目录下的文件(为找到的每一个目录单独执行ls命令,没有选项-print时文件列表前一行不会显示目录名称)
find ./ -type d -print -exec ls {} \;

type

文件类型

# 查找文件
find ./ -type f

#查找目录
find ./ -type d

name

文件名称,可以使用*?符号。i大小写忽略。

# 当前目录下,txt格式,大小写忽略
find . -type f -iname "*.txt"  

emptys

#查找空文件或空目录
find ./ -empty

#查找空文件并删除
find ./ -empty -type f -print -delete

atime

访问时间。

mtime

查找24小时内修改过的文件。

find -type f -mtime -1 

#查找文件更新日时在距现在时刻二天以内的文件
find ./ -mtime -2

#查找文件更新日时在距现在时刻二天以上的文件
find ./ -mtime +2

# 查找文件更新日时在距现在时刻一天以上二天以内的文件
find ./ -mtime 2

mmin

修改,以分钟为单位。 m即modify。

#查找文件更新日时在距现在时刻二分以内的文件
find ./ -mmin -2

#查找文件更新日时在距现在时刻二分以上的文件
find ./ -mmin +2

#查找文件更新日时在距现在时刻一分以上二分以内的文件
find ./ -mmin 2

depth

depth深度优先选项。 意思是:在处理目录以前首先处理目录下的子内容。

也即是说在不加-depth的时候, 处理顺序是首先处理目录本身,然后处理目录下的子内容。加不加-depth参数,会影响输出结构的输出顺序。

maxdepth最大深度。

mindepth最小深度。

find . -maxdepth 1 -mtime -10

regex

#查找名字符合正则表达式的文件,注意前面的‘.*’(查找到的文件带有目录)
find ./ -regex .*so.*\.gz

newer

比某个文件更新。居然没有older选项。

#查找文件更新时间比文件abc的内容更新时间新的文件
find ./ -newer abc

#查找文件访问时间比文件abc的内容更新时间新的文件
find ./ -anewer abc

perm

查找权限

#查找权限为644的文件或目录(需完全符合)
find ./ -perm 664

#查找用户/组权限为读写,其他用户权限为读(其他权限不限)的文件或目录
find ./ -perm -664

#查找用户有写权限或者组用户有写权限的文件或目录
find ./ -perm /220
find ./ -perm /u+w,g+w
find ./ -perm /u=w,g=w

#查找所有者权限有读权限的目录或文件
find ./ -perm -u=r

#查找用户组权限有读权限的目录或文件
find ./ -perm -g=r

#查找其它用户权限有读权限的目录或文件
find ./ -perm -o=r

group/user

查找所有者为lzj的文件或目录
find ./ -user lzj

查找组名为gname的文件或目录
find ./ -group gname

查找文件的用户ID不存在的文件
find ./ -nouser

查找文件的组ID不存在的文件
find ./ -nogroup

size

查找文件size小于10个字节的文件或目录
find ./ -size -10c

查找文件size等于10个字节的文件或目录
find ./ -size 10c

查找文件size大于10个字节的文件或目录
find ./ -size +10c

查找文件size小于10k的文件或目录
find ./ -size -10k

查找文件size小于10M的文件或目录
find ./ -size -10M

查找文件size小于10G的文件或目录
find ./ -size -10G 

ok

执行命令前需要确认,类似于exec

查找目录并列出目录下的文件(为找到的每一个目录单独执行ls命令,执行命令前需要确认)
find ./ -type d -ok ls {} \;

daystart

daystart 选项测量从当天开始而不是24小时之前开始的时间。

例如,要查找昨天编辑的所有pdf文件,请运行:

[root@localhost ~]# find /root/data/ -mtime 1 -daystart -iname "*.pdf"
要列出3-5天之前编辑的文件,请运行以下命令:

[root@localhost ~]# find /home/james/data/ -mtime 3 -mtime -5 -daystart -iname "*.pdf"

应用

查找有执行权限但没有可读权限

#查找有执行权限但没有可读权限的文件
find ./ -executable \! -readable

删除空文件

find */ -type f -empty -delete

镜像搜索

公司用在registry的搜索方案。

find -type d   -name current   |grep current  |grep  tags >  images.list 
#cat /root/yunda_deployments/dev_image_list/sed_delete_useless_tag.sh  

sed 's|./docker/registry/v2/repositories/||g' -i    images.list 
sed 's|_manifests/tags/||g'  -i   images.list 
sed 's|/current/link||g'  -i   images.list 
sed 's|/current||g'  -i   images.list 
sed '/\d-\d/d'  -i   images.list
# 将最后出现的 /  再变分号