find
语法
- find [选项] [查找目录] [条件] [处理动作]
[选项]
[查找目录]
[条件]
- 文件时间
atime 最后访问时间
mtime 最后修改时间(文件内容修改)
ctime 最后状态修改时间(文件内容修改、权限、链接变更)
单位天,也即24小时
+1 超过24小时
-1 24小时内
-amin <分钟>:查找在指定时间曾被存取过的文件或目录,单位以分钟计算;时间点atime
-anewer <参考文件或目录>:查找其存取时间较指定文件或目录的存取时间更接近现在的文件或目录;atime
-atime <24小时数>:查找在指定时间曾被存取过的文件或目录,单位以24小时计算; atime
-cmin <分钟>:查找在指定时间之时被更改过的文件或目录;时间点ctime
-cnewer <参考文件或目录>查找其更改时间较指定文件或目录的更改时间更接近现在的文件或目录;ctime
-ctime <24小时数>:查找在指定时间之时被更改的文件或目录,单位以24小时计算;ctime
-mmin <分钟>:查找在指定时间曾被更改过的文件或目录,单位以分钟计算;
-mtime <24小时数>:查找在指定时间曾被更改过的文件或目录,单位以24小时计算;
**-newer <参考文件或目录>:查找其更改时间较指定文件或目录的更改时间更接近现在的文件或目录;**
-used <日数>:查找文件或目录被更改之后在指定时间曾被存取过的文件或目录,单位以日计算;
-uid <用户识别码>:查找符合指定的 用户识别码 的文件或目录;
-user <拥有者名称>:查找符和指定的 拥有者名称 的文件或目录;
-gid <群组识别码>:查找符合指定之 群组识别码 的文件或目录;
-group <群组名称>:查找符合指定之 群组名称 的文件或目录;
-nogroup:找出不属于本地主机群组识别码的文件或目录;
-nouser:找出不属于本地主机用户识别码的文件或目录;
-noleaf:不去考虑目录至少需拥有两个硬连接存在;
-name <范本样式>:指定字符串作为寻找文件或目录的范本样式;通配符
-iname <范本样式>:指定字符串作为寻找文件或目录的范本样式;通配符,忽略大小写
-regex <范本样式>:指定字符串作为寻找文件或目录的范本样式,正则表达式,匹配整个路径,而不是文件名
-iregex <范本样式>:指定字符串作为寻找文件或目录的范本样式,正则表达式,忽略大小写,匹配整个路径,而不是文件名
-path <范本样式>:指定字符串作为寻找目录的范本样式;
-prune:不寻找字符串作为寻找文件或目录的范本样式;
-depth:从指定目录下最深层的子目录开始查找;
-maxdepth <目录层级>:设置最大目录层级;
-mindepth <目录层级>:设置最小目录层级;
-empty:寻找文件大小为0 Byte的文件,或目录下没有任何子目录或文件的空目录;
-size <文件大小>:查找符合指定的文件大小的文件;
单位K、M、G
1K 等于1K,不足1K算1K
+1K 大于1K
-10K 小于10K
-type <文件类型>:只寻找符合指定的文件类型的文件;
f 普通文件
d 目录
l 符号链接文件
b block设备
c character设备
p 管道文件
s socket套接字文件
-perm <权限数值>:查找符合指定的权限数值的文件或目录;
-perm 755 精确匹配
-perm /755 任何一位满足即可,逻辑or
-perm -755 必须每一位都满足,逻辑and
-exec <执行指令>:假设find指令的回传值为True,就执行该指令;
-false:将find指令的回传值皆设为False;
-true:将find指令的回传值皆设为True;
-fls<列表文件>:此参数的效果和指定“-ls”参数类似,但会把结果保存为指定的列表文件;
-follow:排除符号连接;
-fprint<列表文件>:此参数的效果和指定“-print”参数类似,但会把结果保存成指定的列表文件;
-fprint0<列表文件>:此参数的效果和指定“-print0”参数类似,但会把结果保存成指定的列表文件;
-fprintf<列表文件><输出格式>:此参数的效果和指定“-printf”参数类似,但会把结果保存成指定的列表文件;
-fstype<文件系统类型>:只寻找该文件系统类型下的文件或目录;
-ilname<范本样式>:此参数的效果和指定“-lname”参数类似,但忽略字符大小写的差别;
-inum <inode编号>:查找符合指定的inode编号的文件或目录;
-ipath<范本样式>:此参数的效果和指定“-path”参数类似,但忽略字符大小写的差别;
-iregex<范本样式>:此参数的效果和指定“-regexe”参数类似,但忽略字符大小写的差别;
-links<连接数目>:查找符合指定的硬连接数目的文件或目录;
-iname<范本样式>:指定字符串作为寻找符号连接的范本样式;
-ls:假设find指令的回传值为Ture,就将文件或目录名称列出到标准输出;
-mount:此参数的效果和指定“-xdev”相同;
-ok<执行指令>:此参数的效果和指定“-exec”类似,但在执行指令之前会先询问用户,若回答“y”或“Y”,则放弃执行命令;
-print:假设find指令的回传值为Ture,就将文件或目录名称列出到标准输出。格式为每列一个名称,每个名称前皆有“./”字符串;
-print0:假设find指令的回传值为Ture,就将文件或目录名称列出到标准输出。格式为全部的名称皆在同一行;
-printf<输出格式>:假设find指令的回传值为Ture,就将文件或目录名称列出到标准输出。格式可以自行指定;
-version或——version:显示版本信息;
-xdev:将范围局限在先行的文件系统中;
-xtype<文件类型>:此参数的效果和指定“-type”参数类似,差别在于它针对符号连接检查。
-daystart:从本日开始计算时间;
-help或——help:在线帮助;
[处理动作]
-print:输出至标准输出;默认的动作;
-ls:类似于对查找到的文件执行“ls -l”命令,输出文件的详细信息;
-delete:删除查找到的文件;
-fls /PATH/TO/SOMEFILE:把查找到的所有文件的长格式信息保存至指定文件中;
-ok COMMAND {} \; :对查找到的每个文件执行由COMMAND表示的命令;每次操作都由用户进行确认;
-exec COMMAND {} \; :对查找到的每个文件执行由COMMAND表示的命令;
注意:find传递查找到的文件路径至后面的命令时,是先查找出所有符合条件的文件路径,并一次性传递给后面的命令;
但是有些命令不能接受过长的参数,此时命令执行会失败;另一种方式可规避此问题:
find | xargs COMMAND
实例
列出当前目录及子目录下所有文件和文件夹
find .
find ./ -user root
find ./ -uid 0
find ./ -group mysql
find ./ -gid 3004
find / -nouser
find / -nogroup
find / -type f 查找/目录下的文件
find / -type d 查找/目录下的目录
find / -type l 查找/目录下的符号链接文件
find / -size +1k
find / -size -10M
find / -size 1G
find / -empty -exec ls {} \; 查找并列出大小为0的文件或目录
find / -ctime 1
find / -ctime +1
find / -ctime -1
查找文件更新日时在距现在时刻二天以内的文件
find ./ -mtime -2
查找文件更新日时在距现在时刻二天以上的文件
find ./ -mtime +2
查找文件更新日时在距现在时刻一天以上二天以内的文件
find ./ -mtime 2
查找文件更新日时在距现在时刻二分以内的文件
find ./ -mmin -2
查找文件更新日时在距现在时刻二分以上的文件
find ./ -mmin +2
查找文件更新日时在距现在时刻一分以上二分以内的文件
find ./ -mmin 2
find ./ -newer abc 查找文件 更新时间 比文件abc的内容更新时间新的文件
find ./ -anewer abc 查找文件 访问时间 比文件abc的内容更新时间新的文件
find . ! -newer "aa.txt" -type f 查找比aa.txt旧的文件
find $LOGDIR -type d -mtime +0 -exec compress -r {} \; 将24小时内修改过的文件压缩
find $LOGDIR -type d -mtime +5 -exec rm -f {} \; 将修改时间超过5*24小时的文件删除
find /home -name "*.txt" 在/home目录下查找以.txt结尾的文件名
find /home -iname "*.txt" 在/home目录下查找以.txt结尾的文件名,忽略大小写
find . -name '[A-Z]*.txt' -print 在当前目录及子目录中,查找大写字母开头的txt文件
find /etc -name 'host*' 在/etc及其子目录中,查找host开头的文件
find . \( -name "*.txt" -o -name "*.pdf" \) 当前目录及子目录下查找所有以.txt和.pdf结尾的文件
find . -name "*.txt" -o -name "*.pdf" 当前目录及子目录下查找所有以.txt和.pdf结尾的文件
find . -name "out*" -prune -o -name "*.txt" 在当前目录及子目录中,查找不是out开头的txt文件
ls -alrthi 显示文件或目录inode号,假设为211028
find ./ -inum 211028 -exec mv {} newname.dir \; 目录或文件名称为无法打印的字符时,使用inode进行查找并重命名
匹配文件路径或者文件
find /usr/ -path "*local*"
基于正则表达式匹配文件路径
find . -regex ".*\(\.txt\|\.pdf\)$"
基于正则表达式匹配文件路径,忽略大小写
find . -iregex ".*\(\.txt\|\.pdf\)$"
cd /etc/sysconfig
find . -depth -print|cpio -o -O /home/backup 复制目录树结构