find
内容提要
1.熟悉find命令的格式
2.掌握find命令中各种表达式的书写方法
3.学会使用find命令查找文件
find命令的格式
find命令用于在文件系统中查找满足条件的文件。find命令功能强大,提供了相当多的查找条件。find命令还可以对查找到的文件做操作,如执行Shell命令等。
find命令的格式是:
find [ ...] [] [] []
其中:
n:对每个指定的递归搜索目录树
n若在整个文件系统范围内查找,则起始目录是“/”
n若在当前目录下寻找,则起始目录是“.”,省略表示当前目录
n:控制find命令的行为
n:根据匹配条件查找文件
n:指定对查找结果的操作,默认为显示在标准输出(-print)
不带任何参数的find命令将在屏幕上递归显示当前目录下的文件列表。下面给出一些常用的表达式的解释。
选项表达式
表达式说明
-follow如果遇到符号链接文件,就跟踪链接所指的文件
-regextype TYPE指定-regex和-iregex使用的正则表达式类型,默认为emacs,还可选择posix-awk, posix-basic, posix-egrep和posix-extended
-depth查找进入子目录前先查找完当前目录的文件
-mount查找文件时不跨越文件系统
-xdev查找文件时不跨越文件系统
-maxdepth LEVELS设置最大的查找深度
--help显示find命令帮助信息
--version显示find的版本
条件匹配表达式
表达式说明
-name PATTERN匹配文件名
-iname PATTERN匹配文件名(忽略大小写)
-lname PATTERN匹配符号链接文件名
-ilname PATTERN匹配符号链接文件名(忽略大小写)
-path PATTERN匹配文件的完整路径(不把‘/’和‘.’作为特殊字符)
PATTERN使用Shell的匹配模式,可以使用Shell的通配符(*、?[]),要用“”或‘’括起来
-regex PATTERN以正则表达式匹配文件名
-iregex PATTERN以正则表达式匹配文件名(忽略大小写)
-amin N查找N分钟以前被访问过的所有文件
-atime N查找N天以前被访问过的所有文件
-cmin N查找N分钟以前文件状态被修改过的所有文件(比如权限修改)
-ctime N查找N天以前文件状态被修改过的所有文件 (比如权限修改)
-mmin N查找N分钟以前文件内容被修改过的所有文件
-mtime N查找N天以前文件内容被修改过的所有文件
-uid N查找属于ID号为N用户的所有文件
-gid N查找属于ID号为N组的所有文件
-inum N查找i-node是N的文件
-links N查找硬链接数为N的文件
-size N[bcwkMG]查找大小为N的文件,b(块)默认单位; c(字节) ; w(双字节)
N可以有三种输入方式,+N或-N或N。假设N为20,则:(1) +20:表示20以上(21,22,23等);(2) -20:表示20以内(19,18,17等);(3) 20:表示正好是20。
-perm MODE精确匹配权限模式为MODE的文件。
-perm -MODE匹配权限模式至少为MODE的文件
MODE :与chown命令的书写方式一致,既可以使用字符模式也可以使用8进制模式
-anewer FILE查找所有比FILE的访问时间新的文件
-cnewer FILE查找所有比FILE的状态修改时间新的文件(比如权限修改)
-newer FILE查找所有比FILE的内容修改时间新的文件
-samefile FILE查找与FILE具有相同i-node的文件 (硬链接)
-fstype TYPE只查找指定类型的文件系统
-type [bcdpfls]查找指定类型的文件[块设备,字符设备,目录,管道,普通文件,符号链接, socket套接字]
-empty内容为空的文件
-user NAME查找用户名为NAME的所有文件
-group NAME查找组名为NAME的所有文件
-nouser文件属于不在/etc/passwd文件中的用户
-nogroup文件属于不在/etc/group文件中的组
动作表达式
表达式说明
-print在标准输出上列出查找结果(每行一个文件)
-print0在标准输出上列出查找结果(取消间隔符) 同样与|xargs -0连用
-fprint FILE与-print一致,只是输出到文件FILE
-fprint0 FILE与print0一致,只是输出到文件FILE
-ls使用‘ls -dils’在标准输出上列出查找结果
-fls FILE与-ls一致,只是输出到文件FILE
-prune忽略对某个目录的查找
-exec COMMAND {} \;对符合查找条件的文件执行Linux命令
-ok COMMAND {} \;对符合查找条件的文件执行Linux命令;与-exec不同的是,它会询问用户是否需要执行
组合条件表达式
在书写表达式时,可以使用逻辑运算符与、或、非组成的复合条件,并可以用()改变默认的操作符优先级。下面以优先级由高到低列出可用的逻辑操作符。若以空格作为各个表达式的间隔符,则各个表示式之间是与关系。操作符说明
( EXPR )改变操作符优先次序,一些UNIX版的find命令要使用\( EXPR \)形式
! EXPR表示对表达式取反
EXPR1 EXPR2与逻辑,若EXPR1为假,将不再评估EXPR2
EXPR1 -a EXPR2与EXPR1 EXPR2功能一致
EXPR1 -o EXPR2逻辑或,若EXPR1为真,将不再评估EXPR2
EXPR1 , EXPR2若EXPR1为假,继续评估EXPR2
find命令使用举例
############################################################
### find的版本和使用帮助信息
############################################################
[root@thinkmo ~]# find –-help #显示find命令帮助信息
[root@thinkmo ~]# find –-version #显示find的版本
############################################################
###不指定匹配表达式,显示所有文件
############################################################
#递归显示当前目录的文件列表
[root@thinkmo ~]# find
#递归显示/目录的文件列表
[root@thinkmo ~]# find /
#递归显示/目录的文件列表(仅限于3层目录)
[root@thinkmo ~]# find / -maxdepth 3
#递归显示/目录的文件列表(仅限于/文件系统)
[root@thinkmo ~]# find / -xdev
#递归显示/home、/www、/srv目录的文件列表
[root@thinkmo ~]# find /home /www /srv
############################################################
###按文件名/路径名查找
############################################################
#查找特定的文件名
[root@thinkmo ~]# find -name myfile
[root@thinkmo ~]# find -maxdepth 2 -name symfony
#使用通配符查找特定的文件名
[root@thinkmo ~]# find -name 'd*'
[root@thinkmo ~]# find -name '???'
[root@thinkmo ~]# find -name '[afd]*'
[root@thinkmo ~]# find -iname '[a-z]*'
[root@thinkmo ~]# find -name 'ch[0-2][0-9].txt*'
#匹配文件路径名
[root@thinkmo ~]# find -path '*server'
./vbird/server
./server
[root@thinkmo ~]# find -path '*server[12]'
./server1
./server2./server1/server2
./server2/server2
#以正则表达式匹配文件路径名
[root@thinkmo ~]# find -regex '.*'
[root@thinkmo ~]# find -regex '.*ch0.*'
./ch01
./ch00
./vbird/server/1000results/ch09-01.jpg
[root@thinkmo ~]# find -regex '.*ch[0-9]+'
./ch01
./ch21
./ch00
./ch333
./ch1
./ch41
[root@thinkmo ~]# find -regex '.*ch[0-9]+\.txt'
./ch1.txt
./ch24.txt
############################################################
###按文件属性查找
############################################################
#只查找普通文件
[root@thinkmo ~]# find . -type f
#只查找符号链接文件
[root@thinkmo ~]# find . -type l
#查找硬连接数大于1的文件或目录
[root@thinkmo ~]# find /home -links +1
#查找/tmp目录下小于10M的文件
[root@thinkmo ~]# find /tmp -size -10M
#查找/home目录下大于1G的文件
[root@thinkmo ~]# find /home -size +1G
#查找系统中为空的文件或者目录
[root@thinkmo ~]# find / -empty
#查找在/www中最后10分钟访问过的文件
[root@thinkmo ~]# find /www -amin -10
#查找在/www中最后2天访问过的文件
[root@thinkmo ~]# find /www -atime -2
#查找在/home下最近2天内改动过的文件
[root@thinkmo ~]# find /home -mtime -2
#列出被改动过后2日内被存取过的文件或目录
[root@thinkmo ~]# find /home -used -2
#列出被改动过后90日前被存取过的文件或目录
[root@thinkmo ~]# find /home -used +90
#列出/home目录中属于用户osmond的文件或目录
[root@thinkmo ~]# find /home -user osmond
#列出/home目录中UID大于501的文件或目录
[root@thinkmo ~]# find /home -uid +501
#列出/home目录中组为osmond的文件或目录
[root@thinkmo ~]# find /home -group osmond
#列出/home目录中GID为501的文件或目录
[root@thinkmo ~]# find /home -gid 501
#列出/home目录中不属于本地用户的文件或目录
[root@thinkmo ~]# find /home -nouser
#列出/home目录中不属于本地组的文件或目录
[root@thinkmo ~]# find /home -nogroup
#精确查找权限为664的文件或目录
[root@thinkmo ~]# find . -perm 664
#查找权限至少为664的文件或目录
[root@thinkmo ~]# find . -perm -664
############################################################
###使用逻辑运算构造复杂表达式
############################################################
#查找/tmp目录下21天之前访问过的大于10G的文件
[root@thinkmo ~]# find /tmp -size +10M -a -atime +21
#查找/目录下属主为jjheng或osmond的文件
[root@thinkmo ~]# find / -user jjheng -o -user osmond
#查找/tmp目录下的属主不是osmond的文件
[root@thinkmo ~]# find /tmp ! -user osmond
#在/mnt下查找*.txt且文件系统类型不为vfat的文件
[root@thinkmo ~]# find /mnt -name '*.txt' ! -fstype vfat
#在/tmp下查找名为l开头且类型为符号链接的文件
[root@thinkmo ~]# find /tmp -name 'l*' -type l
#查找以server开头的目录名
[root@thinkmo ~]# find . -type d -name 'server*'
#找出/var/log目录下所有的前5天修改过的.log文件
[root@thinkmo ~]# find /var/log -name '*.log' -mtime +5
############################################################
###按文件样本查找
############################################################
#查找所有比FILE1的访问时间新的文件
[root@thinkmo ~]# find -anewer FILE1
#查找所有比FILE2的访问时间旧的文件
[root@thinkmo ~]# find ! -anewer FILE2
#查找所有比FILE1的访问时间新的#且比FILE2的访问时间旧的文件
[root@thinkmo ~]# find -anewer FILE1 ! -anewer FILE2
#查找所有比FILE1的内容修改时间新的文件
[root@thinkmo ~]# find -newer FILE1
#查找所有比FILE2的内容修改时间旧的文件
[root@thinkmo ~]# find ! -newer FILE2
#查找所有比FILE1的内容修改时间新的
#且比FILE2的内容修改时间旧的文件
[root@thinkmo ~]# find -newer FILE1 ! -newer FILE2
#查找与FILE具有相同i-node的文件(硬链接)
[root@thinkmo ~]# find -samefile FILE -ls
############################################################
###对查找到的文件实施命令操作
############################################################
#查找并列出当前目录下不安全的文件(世界可读写执行)
[root@thinkmo ~]# find . -perm -007 -exec ls -l {} \;
#查找logs目录下的所有的.log文件并查看它的详细信息
[root@thinkmo ~]# find logs -name "*.log" -type f -exec ls -l {} \;
#查找当天修改过的普通文件
[root@thinkmo ~]# find . -type f -mtime -1 -exec ls -l {} \;
#查找当前目录下的.php文件并用grep过滤出包含include的行
[root@thinkmo ~]# find . -name "*.php" -exec grep "include" {} \; -print
#查找并删除当前目录及其子目录下所有扩展名为.tmp的文件
[root@thinkmo ~]# find . -name '*.tmp' -exec rm {} \;
#在logs目录中查找7天之内未修改过的文件并在删除前询问
[root@thinkmo ~]# find logs -type f -mtime +7 -exec -ok rm {} \;
#查询并删除一周以来从未访问过的以.o结尾或名为a.out
#且不存在于nfs文件系统中的所有文件
[root@thinkmo ~]# find / ( -name a.out -o -name '*.o' ) -atime +7 \
! -fstype nfs -exec rm {} \;
#查询并删除当前目录及其子目录下所有的空目录
[root@thinkmo ~]# find . -depth -type d -empty -exec rmdir {} \;
#将default目录下的文件由GBK编码转换为UTF-8编码
#目录结构不变,转码后的文件保存在utf/default目录下
# From: http://www.xiaojb.com/archives/it/convert-gbk-utf-8.shtml
[root@thinkmo ~]# find default -type d -exec mkdir -p utf/{} \;
[root@thinkmo ~]# find default -type f -exec iconv -f GBK -t UTF-8 {} -o utf/{} \;
#下面find命令的书写形式均等价
[root@thinkmo ~]# find -name \*.sh -exec cp {} /tmp \;
[root@thinkmo ~]# find -name '*.sh' -exec cp {} /tmp ';'
[root@thinkmo ~]# find -name "*.sh" -exec cp {} /tmp ";"
[root@thinkmo ~]# find -name \*.sh -exec cp \{\} /tmp \;
[root@thinkmo ~]# find -name '*.sh' -exec cp '{}' /tmp ';'
[root@thinkmo ~]# find -name "*.sh" -exec cp "{}" /tmp ";"
############################################################
###在查找中排除指定的目录
############################################################
#显示当前目录树
[root@thinkmo ~]# tree -F -L 2
.
|-- bin/
| |-- switch-lang.sh*
| ——-- sys2wiki.sh*
|-- book/
| |-- basic/
| |-- basic-utf8/
| |-- basic.zip
| |-- server/
| |-- server-utf8/
| |-- server.zip
| ——-- to-zh-CN-utf8.sh*
——-- bak.sh*
#显示当前目录下除book目录的所有文件
[root@thinkmo ~]# find . -name book -prune -o -print
#查找当前目录下(除了book目录)的所有.sh文件
[root@thinkmo ~]# find . -name book -prune -o -name '*.sh' -print
#显示当前目录下除book/server目录的所有文件
[root@thinkmo ~]# find . -path ./book/server -prune -o -print
#使用绝对路径完成上述任务
[root@thinkmo ~]# find /home/osmond -path /home/osmond/book/server -prune -o -print
#查找当前目录下(除了book/server目录)的所有.sh文件
[root@thinkmo ~]# find . -path ./book/server -prune -o -name '*.sh' -print
#显示当前目录下除book/server和book/server-utf8目录的所有文件
[root@thinkmo ~]# find . -path './book/server*' -prune -o -print
#查找当前目录下(除了book/server和book/server-utf8目录)的所有.sh文件
[root@thinkmo ~]# find . -path './book/server*' -prune -o -name '*.sh' -print
#显示当前目录下除book/server和book/basic目录的所有文件
[root@thinkmo ~]# find . \( -path ./book/server -o -path ./book/basic \) -prune -o -print
#查找当前目录下(除了book/server和book/basic目录)的所有.sh文件
[root@thinkmo ~]# find . \( -path ./book/server -o -path ./book/basic \) -prune -o -name '*.sh' -print