find主要用来查找文件名,其基本格式
find path -option [-print] [-exec -ok command] {} \;
常用参数如下
-name
find . -name four 查找名为four的文件(包括目录和文件)
find . -name "fou*" 查找开头是fou的文件
find . -name "[A-Z]*" 查找大写字母开头的文件
find . -name "*.txt" 查找以.txt结尾的文件
-user
find . -user lee 查找属主为lee的文件
-group
find . -group lee 查找属组为lee的文件
-type
find . -type d 查找文件类型为目录的文件,除了d,还有f,b,c,p,l,s,分别指普通文件,块设备,字符设备,管道,链接文件和socket套接字
find . ! -type f 查找非普通文件的文件,符号!表示反向选择
-size
find . -size 10M 查找大小大于10M的文件,+n表示大于nM的文件,-n表示大小小于nM的文件
-perm
find . -perm 600 查找执行权限为600的文件
find . -perm -007 查找777权限的文件,与-perm 777一样效果,+222表示文件权限在222以上
-mtime
find . -mtime 2 查找文件内容修改在两天前的文件,n代表n天前的当天,-n代表n天以内,+n代表n天以前
-atime
find . -atime 2 查找2天前被访问过的文件,n表示n天前当天被访问过,-n表示n天以内被访问过,+n表示n天以前被访问过的
-ctime
find . -ctime +4 查找4天以前文件状态被修改的文件,比如改了文件权限等,-n表示n天以内文件状态有变过,+n表示n天以前文件状态被改过,n表示n天前当天文件状态被改了。
-mmin/-amin/-cmin与上面类似,只是单位变成了分钟
-depth 表示在进入子目录查找之前先在查找完当前目录
-maxdepth 只在当前文件夹这一级来搜索,而不去递归向下搜索
find . -maxdepth 1 -name four 在当前目录下找名为four的,不去子目录下找
find . -maxdepth 1 -type f 注意maxdepth的位置要在前面
find . -maxdepth 1 -size +100M -exec ls -lh {} \; 把大于100M的文件显示出来,不搜索跨级目录下的文件
-a
find . -name "four*" -type d
find . -name "four*" -a -type d 这两个语句的结果是一样的,只是-a把-name "four*"和-type d两个表达式组合在一起
-exec表示对搜索到的每个文件执行指定的命令
cp表示复制
{}表示搜索到的每个文件
\;表示命令的结束,为避免转义故在;前加符号\
如果是移动的话则是-exec mv {} {}.other \;
find . -name "*.txt" -type f -exec cp {} /tmp \; 查找.txt结尾的普通文件并复制到tmp目录下,-
find . -name "[A-Z]*" | xargs chmod 600 -R 查找大写字母开头的文件及子文件并把权限设置为600,注意-R代表子文件的权限也会修改
可以同时指定多个要搜索的文件夹,而如下的搜索有重复的结果,因为当前目录就是在/root下面(符号.代表当前目录)
[root@localhost ~]# find . /root -name four
./package/four
./four
/root/package/four
/root/four
如果指定要搜索的文件夹本身不存在,则会直接报错
[root@localhost ~]# find hello -name abc
find: “hello”: 没有那个文件或目录
-newerab a和b代表不同类型,包括访问时间a,修改时间m和状态变化时间c等
find . -newermt 2017-08-23 表示修改时间m比2017-08-23新的文件,t后面直接接时间
一般不直接在根目录下用find去找文件,因为会耗费不小系统资源,而是在相对目录下去找
最后,find支持正则,默认类型是emacs,可以通过-regextype来指定要用的类型