find命令用来在目录结构中搜索文件,并执行指定的操作,Linux下find命令提供了相当多的查找条件,功能很强大。由于find具有强大的功能,所以它的选项也很多,其中大部分选项都值得我们花时间来了解一下。即使系统中含有网络文件系统( NFS),find命令在该文件系统中同样有效,只要你具有相应的权限。 在运行一个非常消耗资源的find命令时,很多人都倾向于把它放在后台执行,因为遍历一个大的文件系统可能会花费很长的时间(这里是指30G字节以上的文件系统)。
find (选项)(参数) || find pathname -options [-print -exec -ok ...]
------------------------------------------------------------------------------------
pathname: find命令所查找的目录路径。例如用.来表示当前目录,用/来表示系统根目录。 -print: find命令将匹配的文件输出到标准输出。 -exec: find命令对匹配的文件执行该参数所给出的shell命令。相应命令的形式为'command' { } \;,注意{ }和\;之间的空格。 -ok: 和-exec的作用相同,只不过以一种更为安全的模式来执行该参数所给出的shell命令,在执行每一个命令之前,都会给出提示,让用户来确定是否执行。
实例一:查找指定时间内修改过的文件
命令:
find -atime -2
输出:
[root@peidachang ~]# find -atime -2
.
./logs/monitor
./.bashrc
./.bash_profile
./.bash_history
说明:
超找48小时内修改过的文件
实例二:根据关键字查找
命令:
find . -name "*.log"
输出:
[root@localhost test]# find . -name "*.log"
./log_link.log
./log2014.log
./test4/log3-2.log
./test4/log3-3.log
./test4/log3-1.log
./log2013.log
./log2012.log
./log.log
./test5/log5-2.log
./test5/log5-3.log
./test5/log.log
./test5/log5-1.log
./test5/test3/log3-2.log
./test5/test3/log3-3.log
./test5/test3/log3-1.log
./test3/log3-2.log
./test3/log3-3.log
./test3/log3-1.log
说明:
在当前目录查找 以.log结尾的文件。 ". "代表当前目录
实例三:按照目录或文件的权限来查找文件
命令:
find /opt/soft/test/ -perm 777
输出:
[root@localhost test]# find /opt/soft/test/ -perm 777
/opt/soft/test/log_link.log
/opt/soft/test/test4
/opt/soft/test/test5/test3
/opt/soft/test/test3
说明:
查找/opt/soft/test/目录下 权限为 777的文件
实例四:按类型查找
命令:
find . -type f -name "*.log"
输出:
[root@localhost test]# find . -type f -name "*.log"
./log2014.log
./test4/log3-2.log
./test4/log3-3.log
./test4/log3-1.log
./log2013.log
./log2012.log
./log.log
./test5/log5-2.log
./test5/log5-3.log
./test5/log.log
./test5/log5-1.log
./test5/test3/log3-2.log
./test5/test3/log3-3.log
./test5/test3/log3-1.log
./test3/log3-2.log
./test3/log3-3.log
./test3/log3-1.log
[root@localhost test]#
说明:
查找当目录,以.log结尾的普通文件
实例五:查找当前所有目录并排序
命令:
find . -type d | sort
输出:
[root@localhost test]# find . -type d | sort
.
./scf
./scf/bin
./scf/doc
./scf/lib
./scf/service
./scf/service/deploy
./scf/service/deploy/info
./scf/service/deploy/product
./test3
./test4
./test5
./test5/test3
[root@localhost test]#
实例六:按大小查找文件
命令:
find . -size +1000c -print
输出:
[root@localhost test]# find . -size +1000c -print
.
./test4
./scf
./scf/lib
./scf/service
./scf/service/deploy
./scf/service/deploy/product
./scf/service/deploy/info
./scf/doc
./scf/bin
./log2012.log
./test5
./test5/test3
./test3
[root@localhost test]#
说明:
查找当前目录大于1K的文件
根据文件或者正则表达式进行匹配
列出当前目录及子目录下所有文件和文件夹
find .
在/home目录下查找以.txt结尾的文件名
<span style="color: rgb(51, 51, 51); font-family: 'Times New Roman'; font-size: 14px; line-height: 24px; text-indent: 28px;">find /home -name "*.txt"</span>
同上,但忽略大小写
<span style="color: rgb(51, 51, 51); font-family: 'Times New Roman'; font-size: 14px; line-height: 24px; text-indent: 28px;">find /home -iname "*.txt"</span><span style="color: rgb(51, 51, 51); font-family: 'Times New Roman'; font-size: 14px; line-height: 24px; text-indent: 28px;"> </span>
当前目录及子目录下查找所有以.txt和.pdf结尾的文件
<span style="color: rgb(51, 51, 51); font-family: 'Times New Roman'; font-size: 14px; line-height: 24px; text-indent: 28px;">find . \( -name "*.txt" -o -name "*.pdf" \) 或 find . -name "*.txt" -o -name "*.pdf"</span>
匹配文件路径或者文件
<span style="color: rgb(51, 51, 51); font-family: 'Times New Roman'; font-size: 14px; line-height: 24px; text-indent: 28px;">find /usr/ -path "*local*"</span>
基于正则表达式匹配文件路径
<span style="color: rgb(51, 51, 51); font-family: 'Times New Roman'; font-size: 14px; line-height: 24px; text-indent: 28px;">find . -regex ".*\(\.txt\|\.pdf\)$"</span>
同上,但忽略大小写
<span style="color: rgb(51, 51, 51); font-family: 'Times New Roman'; line-height: 24px;">find . -iregex ".*\(\.txt\|\.pdf\)$"</span>
否定参数
找出/home下不是以.txt结尾的文件
<span style="color: rgb(45, 55, 75); font-family: Verdana, Geneva, sans-serif; font-size: 14px; line-height: 18px; text-indent: 28px;">find /home ! -name "*.txt"</span>
根据文件类型进行搜索
类型参数列表: f 普通文件
l 符号连接
d 目录
c 字符设备
b 块设备
s 套接字 p Fifo
find . -type 类型参数
基于目录深度搜索
向下最大深度限制为3
<span style="color: rgb(51, 51, 51); font-family: 'Times New Roman'; font-size: 14px; line-height: 24px; text-indent: 28px;">find . -maxdepth 3 -type f</span><span style="color: rgb(51, 51, 51); font-family: 'Times New Roman'; font-size: 14px; line-height: 24px; text-indent: 28px;"> </span>
搜索出深度距离当前目录至少2个子目录的所有文件
<span style="color: rgb(51, 51, 51); font-family: 'Times New Roman'; font-size: 14px; line-height: 24px; text-indent: 28px;"><span style="color: rgb(51, 51, 51); font-family: 'Times New Roman'; font-size: 14px; line-height: 24px; text-indent: 28px;"> find . -mindepth 2 -type f</span></span>
根据文件时间戳进行搜索
find . -type f 时间戳
访问时间(-atime/天,-amin/分钟):用户最近一次访问时间。
修改时间(-mtime/天,-mmin/分钟):文件最后一次修改时间。
变化时间(-ctime/天,-cmin/分钟):文件数据元(例如权限等)最后一次修改时间。
搜索最近七天内被访问过的所有文件
<span style="color: rgb(51, 51, 51); font-family: 'Times New Roman'; font-size: 14px; line-height: 24px; text-indent: 28px;"><span style="color: rgb(51, 51, 51); font-family: 'Times New Roman'; font-size: 14px; line-height: 24px; text-indent: 28px;">find . -type f -atime -7</span></span>
搜索恰好在七天前被访问过的所有文件
<span style="color: rgb(51, 51, 51); font-family: 'Times New Roman'; font-size: 14px; line-height: 24px; text-indent: 28px;"></span><span style="color: rgb(51, 51, 51); font-family: 'Times New Roman'; font-size: 14px; line-height: 24px; text-indent: 28px;"> find . -type f -atime 7</span><span style="color: rgb(51, 51, 51); font-family: 'Times New Roman'; font-size: 14px; line-height: 24px; text-indent: 28px;"></span>
搜索超过七天内被访问过的所有文件
<span style="color: rgb(51, 51, 51); font-family: 'Times New Roman'; font-size: 14px; line-height: 24px; text-indent: 28px;"><span style="color: rgb(51, 51, 51); font-family: 'Times New Roman'; font-size: 14px; line-height: 24px; text-indent: 28px;">find . -type f -atime +7</span><span style="color: rgb(51, 51, 51); font-family: 'Times New Roman'; font-size: 14px; line-height: 24px; text-indent: 28px;"> </span></span>
搜索访问时间超过10分钟的所有文件
<span style="color: rgb(51, 51, 51); font-family: 'Times New Roman'; font-size: 14px; line-height: 24px; text-indent: 28px;"><span style="color: rgb(51, 51, 51); font-family: 'Times New Roman'; font-size: 14px; line-height: 24px; text-indent: 28px;">find . -type f -amin +10</span></span>
找出比file.log修改时间更长的所有文件
<span style="color: rgb(51, 51, 51); font-family: 'Times New Roman'; font-size: 14px; line-height: 24px; text-indent: 28px;"><span style="color: rgb(51, 51, 51); font-family: 'Times New Roman'; font-size: 14px; line-height: 24px; text-indent: 28px;">find . -type f -newer file.log</span></span>
根据文件大小进行匹配
find . -type f -size 文件大小单元
搜索大于10KB的文件
<span style="color: rgb(51, 51, 51); font-family: 'Times New Roman'; font-size: 14px; line-height: 24px; text-indent: 28px;"><span style="font-family: 'Times New Roman'; font-size: 14px; text-indent: 28px;">find . -type f -size +10k</span></span>
搜索小于10KB的文件
<span style="color: rgb(51, 51, 51); font-family: 'Times New Roman'; font-size: 14px; line-height: 24px; text-indent: 28px;"><span style="color: rgb(51, 51, 51); font-family: 'Times New Roman'; font-size: 14px; line-height: 24px; text-indent: 28px;">find . -type f -size -10k</span></span><span style="color: rgb(51, 51, 51); font-family: 'Times New Roman'; font-size: 14px; line-height: 24px; text-indent: 28px;"> </span>
搜索等于10KB的文件
<span style="color: rgb(51, 51, 51); font-family: 'Times New Roman'; font-size: 14px; line-height: 24px; text-indent: 28px;"><span style="color: rgb(51, 51, 51); font-family: 'Times New Roman'; font-size: 14px; line-height: 24px; text-indent: 28px;">find . -type f -size 10k</span><span style="color: rgb(51, 51, 51); font-family: 'Times New Roman'; font-size: 14px; line-height: 24px; text-indent: 28px;"> </span></span>
删除匹配文件
删除当前目录下所有.txt文件
<span style="font-family: 'Times New Roman'; font-size: 14px; text-indent: 28px;">find . -type f -name "*.txt" -delete</span>
根据文件权限/所以权进行匹配
当前目录下搜索出权限为777的文件
<span style="font-family: 'Times New Roman'; font-size: 14px; text-indent: 28px;">find . -type f -perm 777</span>
找出当前目录下权限不是644的php文件
<span style="color: rgb(51, 51, 51); font-family: 'Times New Roman'; font-size: 14px; line-height: 24px; text-indent: 28px;"><span style="font-family: 'Times New Roman'; font-size: 14px; text-indent: 28px;">find . -type f -name "*.php" ! -perm 644</span><span style="font-family: 'Times New Roman'; font-size: 14px; text-indent: 28px;"> </span></span>
找出当前目录用户tom拥有的所有文件
<span style="color: rgb(51, 51, 51); font-family: 'Times New Roman'; font-size: 14px; line-height: 24px; text-indent: 28px;"></span><span style="color: rgb(51, 51, 51); font-family: 'Times New Roman'; font-size: 14px; line-height: 24px; text-indent: 28px;">find . -type f -user tom</span><span style="color: rgb(51, 51, 51); font-family: 'Times New Roman'; font-size: 14px; line-height: 24px; text-indent: 28px;"></span>
找出当前目录用户组sunk拥有的所有文件
<span style="color: rgb(51, 51, 51); font-family: 'Times New Roman'; font-size: 14px; line-height: 24px; text-indent: 28px;"><span style="color: rgb(51, 51, 51); font-family: 'Times New Roman'; font-size: 14px; line-height: 24px; text-indent: 28px;">find . -type f -group sunk</span><span style="color: rgb(51, 51, 51); font-family: 'Times New Roman'; font-size: 14px; line-height: 24px; text-indent: 28px;"> </span></span>
借助-exec选项与其他命令结合使用
找出当前目录下所有root的文件,并把所有权更改为用户tom
<span style="color: rgb(51, 51, 51); font-family: 'Times New Roman'; font-size: 14px; line-height: 24px; text-indent: 28px;">find .-type f -user root -exec chown tom {} \;</span>
找出自己家目录下所有的.txt文件并删除
<span style="color: rgb(51, 51, 51); font-family: 'Times New Roman'; font-size: 14px; line-height: 24px; text-indent: 28px;">find $HOME/. -name "*.txt" -ok rm {} \;</span>
查找当前目录下所有.txt文件并把他们拼接起来写入到all.txt文件中
<span style="color: rgb(51, 51, 51); font-family: 'Times New Roman'; line-height: 24px;"><span style="color: rgb(45, 55, 75); font-family: Verdana, Geneva, sans-serif; font-size: 14px; line-height: 18px; text-indent: 28px;">find . -type f -name "*.txt" -exec cat {} \;> all.txt</span></span>
将30天前的.log文件移动到old目录中
<span style="color: rgb(51, 51, 51); font-family: 'Times New Roman'; line-height: 24px;"><span style="color: rgb(45, 55, 75); font-family: Verdana, Geneva, sans-serif; font-size: 14px; line-height: 18px; text-indent: 28px;">find . -type f -mtime +30 -name "*.log" -exec cp {} old \;</span></span>
找出当前目录下所有.txt文件并以“File:文件名”的形式打印出来
<span style="color: rgb(51, 51, 51); font-family: 'Times New Roman'; line-height: 24px;"><span style="color: rgb(45, 55, 75); font-family: Verdana, Geneva, sans-serif; line-height: 18px;"><span style="color: rgb(45, 55, 75); font-family: Verdana, Geneva, sans-serif; font-size: 14px; line-height: 18px; text-indent: 28px;">find . -type f -name "*.txt" -exec printf "File: %s\n" {} \;</span></span></span>
因为单行命令中-exec参数中无法使用多个命令,以下方法可以实现在-exec之后接受多条命令
<span style="color: rgb(51, 51, 51); font-family: 'Times New Roman'; line-height: 24px;"><span style="color: rgb(45, 55, 75); font-family: Verdana, Geneva, sans-serif; line-height: 18px;"><span style="color: rgb(45, 55, 75); font-family: Verdana, Geneva, sans-serif; font-size: 14px; line-height: 18px; text-indent: 28px;">-exec ./text.sh {} \;</span></span></span>
搜索但跳出指定的目录
查找当前目录或者子目录下所有.txt文件,但是跳过子目录sk
<span style="color: rgb(51, 51, 51); font-family: 'Times New Roman'; line-height: 24px;">find . -path "./sk" -prune -o -name "*.txt" -print</span><span style="color: rgb(51, 51, 51); font-family: 'Times New Roman'; line-height: 24px;"> </span>
find其他技巧收集
要列出所有长度为零的文件
<span style="color: rgb(51, 51, 51); font-family: 'Times New Roman'; font-size: 14px; line-height: 24px; text-indent: 28px;"></span><span style="color: rgb(51, 51, 51); font-family: 'Times New Roman'; font-size: 14px; line-height: 24px; text-indent: 28px;">find . -empty</span><span style="color: rgb(51, 51, 51); font-family: 'Times New Roman'; font-size: 14px; line-height: 24px; text-indent: 28px;"></span>