Linux find命令

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux find命令相关的知识,希望对你有一定的参考价值。

命令功能:

在目录结构中搜索文件,并执行指定的操作。

语法:

find 路径 -选项 参数
find?pathname?-options?[-print?-exec?-ok?...]

可以通俗理解为:find [查找路径] 寻找条件 操作。

选项

选项 详细说明 举例
-name 匹配名称
-iname 此参数的效果和指定“-name”参数类似,但忽略字符大小写的差别;
-ilname 此参数的效果和指定“-lname”参数类似,但忽略字符大小写的差别;
--- --- ---
-user 匹配所有者
-group 匹配所有组
-gid <群组识别码> 查找符合指定之群组识别码的文件或目录;
-nouser 匹配不是所有者的文件
-nogroup 匹配不是所有组的文件
--- --- ---
-mmin -n,n,+n 匹配修改内容的时间(-n指n分钟以内,+n指n分钟以前)
-amin -n,n,+n 匹配访问文件的时间-n指n分钟以内,+n指n分钟以前
-cmin -n,n,+n 匹配修改权限的时间-n指n分钟以内,+n指n分钟以前
-mtime -n,n,+n 匹配修改内容的时间(-n指n天以内,+n指n天以前)
-atime -n,n,+n 匹配访问文件的时间-n指n天以内,+n指n天以前
-ctime -n,n,+n 匹配修改权限的时间-n指n天以内,+n指n天以前
-daystart 从本日开始计算时间;
--- --- ---
-anewer <参考文件或目录> 查找其存取时间较指定文件或目录的存取时间更接近现在的文件或目录;
-cnewer <参考文件或目录> 查找其更改时间较指定文件或目录的更改时间更接近现在的文件或目录;
-newer <参考文件或目录> 查找其更改时间较指定文件或目录的更改时间更接近现在的文件或目录;
--- --- ---
-perm 匹配权限(mode为完全匹配,-mode为包含即可)
-inum 查找符合指定的inode编号的文件或目录;
-newer f1 !f2 匹配比文件f1新却比f2旧的文件
--size 匹配文件的大小(+50k查找超过50k的文件,而-50k则代表查找小于50k的文件)
-empty 寻找文件大小为0 Byte的文件,或空目录;
-prune 忽略某个目录
--type b/d/c/p/l/f/s 匹配文件类型(块设备、目录、字符设备、管道、符号链接、文件文件、套接字)
-depth 从指定目录下最深层的子目录开始查找;
-maxdepth <目录层级> 设置最大目录层级;
-mindepth <目录层级> 设置最小目录层级;
-iname 匹配名称(但忽略大小写)
find /home ! -name "*.txt" 找出/home下不是以.txt结尾的文件
-o 或;满足一个条件就算;
-follow 排除符号连接;
-fstype <文件系统类型> 只寻找该文件系统类型下的文件或目录;
-fprint <列表文件> 此参数的效果和指定“-print”参数类似,但会把结果保存成指定的列表文件;
-fprint0 <列表文件> 此参数的效果和指定“-print0”参数类似,但会把结果保存成指定的列表文件;
-fprintf <列表文件> <输出格式> 此参数的效果和指定“-printf”参数类似,但会把结果保存成指定的列表文件;

参数

参数 详细说明 举例
-print find命令将匹配的文件输出到标准输出。?
-ls 假设find指令的回传值为Ture,就将文件或目录名称列出到标准输出;
-fls <列表文件> 此参数的效果和指定“-ls”参数类似,但会把结果保存为指定的列表文件;
--exec <执行指令> 假设find指令的回传值为True,就执行该指令;后面可接对搜索到结果进一步处理的命令
-ok <执行指令> 此参数的效果和指定“-exec”类似,但在执行指令之前会先询问用户,若回答“y”或“Y”,则放弃执行命令;
-false 将find指令的回传值皆设为False;
-true 将find指令的回传值皆设为True;

说明:

{} 用于与-exec选项结合使用来匹配所有文件,然后会被替换为相应的文件名。
{}与之间有空格

举例

1 与时间有关的选项:

访问时间(-atime/天,-amin/分钟):用户最近一次访问时间。
修改时间(-mtime/天,-mmin/分钟):文件最后一次修改时间。
变化时间(-ctime/天,-cmin/分钟):文件数据元(例如权限等)最后一次修改时间。
-mtime n :n 为数字,第n天更改过内容的档案;
-mtime +n : n 天之前(不含 n 天)被更动内容的档案档名;
-mtime -n : n 天之内(含 n 天本身)被更动内容的档案档名。
-newer file :file 为一个已经存在的档案,列出比 file 还要新的档案档名 ;对比;
找出比file.log修改时间更长的所有文件
find . -type f -newer file.log
范例一:将过去系统上面 24 小时内有更改过内容 (mtime) 的档案列出

$ find / -mtime 0

#那个 0 是重点!0 代表目前的时间,所以,从现在开始到 24 小时前,
#有变东过内容的档案都会被列出来!那如果是三天前的 24 小时内?
#find / -mtime 3 有变动过的档案都被列出的意思!

范例二:寻找 /etc 底下的档案,如果档案日期比 /etc/passwd 新就列出

$ find /etc -newer /etc/passwd

-newer 用在分辨两个档案之间的新旧关系是很有用的!

+4 代表大于等于 5 天前的档名:ex> find /var -mtime +4 ?
-4 代表小于等于 4 天内的档案档名:ex> find /var -mtime -4 ?
4 则是代表 4-5 那一天的档案档名:ex> find /var -mtime 4

2 按文件名查找

-name:按名称查找;

find  /home  -name  "*.txt"
find  /home  -iname  "*.txt"    -i忽略大小写
find . -name "*.txt" -o -name "*.pdf"?     或       find . ( -name "*.txt" -o -name "*.pdf" )  

当前目录及子目录下查找所有以.txt和.pdf结尾的文件

3 按文件类型:

-type: 按文件类型查找;
f 普通文件
d 目录

$ find  ./  -type  f
$ find  ./  -type  d

4 基于目录深度搜索

-maxdepth<目录层级>:设置最大目录层级;
-mindepth<目录层级>:设置最小目录层级;
搜索出深度距离当前目录至少2个子目录的所有文件

$ find . -mindepth 2 -type f

5 文件大小单元:

-size:大小
b —— 块(512字节)
c —— 字节
w —— 字(2字节)
k —— 千字节
M —— 兆字节
G —— 吉字节
搜索大于10KB的文件

$ find . -type f -size +10k

6 删除匹配文件

-delete :
删除当前目录下所有.txt文件

$ find . -type f -name "*.txt" -delete

7 根据文件权限修改

-perm :权限
-user :拥有者
-group :用户组
找出当前目录下权限不是644的php文件

$ find . -type f -name "*.php" ! -perm 644 

找出当前目录用户tom拥有的所有文件

$ find . -type f -user tom 

找出当前目录用户组sunk拥有的所有文件

$ find . -type f -group sunk

8 搜索但跳出指定的目录

-prune
查找当前目录或者子目录下所有.txt文件,但是跳过子目录sk

$ find . -path "./sk" -prune -o -name "*.txt" -print find

9 借助-exec选项与其他命令结合使用

找出当前目录下所有root的文件,并把所有权更改为用户tom

$ find .-type f -user root -exec chown tom {}  ;       

上例中,{} 用于与-exec选项结合使用来匹配所有文件,然后会被替换为相应的文件名。

找出自己家目录下所有的.txt文件并删除
find $HOME/. -name "*.txt" -ok rm {} ;
#上例中,-ok和-exec行为一样,不过它会给出提示,是否执行相应的操作。

查找当前目录下所有.txt文件并把他们拼接起来写入到all.txt文件中
find . -type f -name "*.txt" -exec cat {} ;> all.txt

将30天前的.log文件移动到old目录中

$ find . -type f -mtime +30 -name "*.log" -exec cp {} old ; 

找出当前目录下所有.txt文件并以“File:文件名”的形式打印出来

$ find . -type f -name "*.txt" -exec printf "File: %s
" {} ; 

因为单行命令中-exec参数中无法使用多个命令,以下方法可以实现在-exec之后接受多条命令
-exec ./text.sh {} ;

10 应用

find  ./  -type f  -name ‘*.log.201*‘   -mtime +20 |xargs  rm  -f    删除(文件类型:文件;;名字是 *.log.201*一类的;;时间是20天前的);
find ./ -maxdepth 2 -type d -name "201*" -mtime +20

-maxdepth 2 查找深度 为 2;;文件类型为目录;

找出用户linuxprobe的文件并复制到/root/findresults目录。
重点是”-exec {} ;”其中的{}代表find命令搜索出的文件,记住结尾必须是;

find / -user linuxprobe -exec cp -arf {} /root/findresults/ ;

以上是关于Linux find命令的主要内容,如果未能解决你的问题,请参考以下文章

mvn命令异常:An error has occurred in Javadoc report generation: Unable to find javadoc command异常已解决(代码片段

使用find命令查找Linux中的隐藏文件的方法

linux的查找命令 find whereis locate

linux学习find命令Linux文件后缀名Linux和windows文件互传

Linux的下的文件查找命令find

Linux基础教程 linux下使用find命令根据系统时间查找文件用法