功能:文件查找。命令原型
find [path] option [expression];
default path is thecurrent directory; default expression is -print.
path是find命令所查找的目录路径。忽略该参数,find就在当前工作目录及其子目录下递归进行搜索;如果有path参数,就在指定目录及其子目录下递归查找; .指当前目录,.. 指父目录
-print:find命令将匹配的文件输出到标准输出
常用的选项option
-name filename_str
查找名为filename_str的文件,选项–name的参数指定了文件名所必须匹配的字符串。我们可以将通配符作为参数使用,如*.txt能够匹配所有以.txt 结尾的文件名,?.txt能够匹配所有以txt结尾的文件且文件名只有一个字符。
如果想匹配多个条件中的一个,可以采用或条件(-o)操作。如
[root@localhostfindtest]# ll -a
total40
drwxr-xr-x 3 root root 4096 Jul 11 17:31 .
dr-xr-x---.16 root root 4096 Jul 11 17:31 ..
-rw-r--r-- 1 root root 48 Feb 25 16:25 dump.rdb
-rw-r--r-- 1 root root 16253 May 17 14:03 ISBN-9787511415073.pdf
-rw-r--r-- 1 root root 225 Jul 11 17:28logincook.txt
drwxr-xr-x 2 root root 4096 Mar 22 11:32 testredis
-rw-r--r-- 1 apache root 58 May 6 17:43 test.txt
[root@localhostfindtest]# ll testredis/ -a
total24
drwxr-xr-x2 root root 4096 Mar 22 11:32 .
drwxr-xr-x3 root root 4096 Jul 11 17:31 ..
-rw-r--r--1 root root 623 Apr 15 11:02appendonly.aof
-rw-r--r--1 root root 41 Mar 22 11:32 dump.rdb
-rw-r--r--1 root root 441 Mar 4 10:32 test1.txt
-rw-r--r--1 root root 441 Mar 4 10:34 test2.txt
[root@localhostfindtest]#
如果我们想打印出所有的testX.txt 和.pdf 文件,可以使用如下命令,
[root@localhostfindtest]# find . \( -name "test?.txt" -o -name "*.pdf" \)
./ISBN-9787511415073.pdf
./testredis/test1.txt
./testredis/test2.txt
\(以及\)用于将 -name "test?.txt" -o -name "*.sh"视为一个整体。可以看出find命令会返回相对于指定搜索路径下符合条件的文档。
有通配符的参数,一般需要加上单引号或双引号,尤其是通配符出现在首字母位置上时。
[root@localhostfindtest]# find . -name *.txt
find:paths must precede expression: test.txt
Usage:find [-H] [-L] [-P] [-Olevel] [-D help|tree|search|stat|rates|opt|exec][path...] [expression]
[root@localhostfindtest]#
如果不加引号或对*进行转义,上述代码等价于
[root@localhostfindtest]# find . -name test.txt logincook.txt ./testredis/test2.txt ./testredis/test1.txt
find:paths must precede expression: test.sh
Usage:find [-H] [-L] [-P] [-Olevel] [-D help|tree|search|stat|rates|opt|exec][path...] [expression]
find命令有一个选项 -iname(忽略字母大小写),该选项的作用和 -name类似,只不过在匹配名字时会忽略大小写。
还可以用“!”放在-name前表示查找不匹配指定name的文件。
[root@localhostfindtest]# find . \( -name "test?.txt" -o -name "*.pdf" \)! -name test1.txt
./ISBN-9787511415073.pdf
./testredis/test2.txt
-user username
按文件属主来查找
[root@localhostfindtest]# find . -user apache -name "*.txt"
./test.txt
-group groupname
按组来查找
-type b/d/c/p/l/f
Unix 类系统将一切都视为文件。文件具有不同的类型,例如普通文件(f)、目录(d)、字符设备(c)、块设备(b)、符号链接(l)、硬链接(h)、套接字(s)以及FIFO(p)等。-type可以对文件搜索进行过滤。借助这个选项,我们可以为find命令指明特定的文件匹配类型。
[root@localhostfindtest]# find . -type d
.
./testredis
-mtime\-atime\-ctime -n\+n
指定按时间来搜索。-mtime,按文件更改时间来查找文件;-atime,按文件访问时间来查找文件;-ctime,按文件状态改变时间来查找文件;
它们可以用整数值指定时间选项,单位是天,-表示小于,+表示大于。如
当前目录下打印出恰好在7天前被访问过的所有文件
$ find. -type f -atime 7 -print
打印出访问时间超过7天的所有文件
$ find. -type f -atime +7 -print
-atime 、-mtime以及-ctime都是基于时间的参数,其计量单位是“天”。还有其他一些基于时间的参数是以分钟作为计量单位的:-amin(访问时间)、-mmin(修改时间)、-cmin(变化时间)。
-newer filename
查更改时间比filename新的文件
$ find. -type f -newer file.txt
-nogroup
#查无有效属组的文件,即文件的属组在/etc/groups中不存在
-nouser
#查无有效属主的文件,即文件的属主在/etc/passwd中不存
-perm
也可以根据文件权限进行文件匹配。
如打印出权限为644 的文件
$ find. -type f -perm 644 -print
-sizen [bkMG]
查长度为n[bkMG]字节的文件,查找大于某个数值的文件时,n前面加+;小于的话加-。
-delete
可以用来删除find查找到的匹配文件。
如删除当前目录下所有的 .swp文件:
$ find. -type f -name "*.swp" -delete
-prune
在搜索目录并执行某些操作时,有时为了提高性能,需要跳过一些子目录。将某些文件或目录从搜索过程中排除在外的技巧被称为修剪(搜索不会进入这些目录下)。通常和-o连用,后面跟上表达式。
[root@localhostfindtest]# find . -path "./testredis" -prune -o -name"*.txt"
./test.txt
./testredis
./logincook.txt
-path "./testredis"
-prune 的作用是用于进行排除,它指明当前目录下的testredis目录应该被排除在外,
-maxdepth \-mindepth
find命令在使用时会遍历所有的子目录。我们可以采用深度选项-maxdepth和-mindepth
来限制find命令遍历的目录深度。我们使用深度选项来限制find命令向下查找的深度。如果只允许find在当前目录中查找,深度可以设置为1;当需要向下两级时,深度可以设置为2;其他情况可以依次类推。
可以用-maxdepth指定最大深度。如
$ find. -maxdepth 1 -name "f*" -print
该命令列出当前目录下的所有文件名以f 打头的文件。即使有子目录,也不会被打印或遍历。
-mindepth类似于 -maxdepth,不过它设置的是find开始遍历的最小深度。这个选项可以用来查找并打印那些距离起始路径一定深度的所有文件。例如,打印出深度距离当前目录至少两个子目录的所有文件,即告诉find应该从距离当前目录2级的地方开始向下查找。
$ find. -mindepth 2 -name "f*" -print
./dir1/dir2/file1
./dir3/dir4/f2
即使当前目录或dir1 和dir3 中包含有文件,它们也不会被打印出来。
-maxdepth和-mindepth应该作为find的第三个参数出现。如果作为第4个或之后的参数,就可能会影响到find的效率,因为它不得不进行一些不必要的检查。例如,如果-maxdepth作为第四个参数,-type 作为第三个参数,find首先会找出符合-type的所有文件,然后在所有匹配的文件中再找出符合指定深度的那些。但是如果反过来,目录深度作为第三个参数,-type作为第四个参数,那么find就能够在找到所有符合指定深度的文件后,再检查这些文件的类型,这才是最有效的搜索之道。
-exec
find命令可以借助选项-exec 与其他命令进行结合。find命令对匹配的文件执行该参数所给出的任何shell命令。-exec之后可以接任何命令,它的格式如下
'command'{ } \;
注意{ }和\之间的空格,{}表示一个匹配。对于任何匹配的文件名,{}均会被该文件名所替换,";"表示命令结束,"\"用于转义且前面必须要有空格。
如将7天前的文件复制到testdir目录中:
$ find. \( -path "./flaskweb" -o-path "./.git" \) -prune-o \( -type f -mtime +7 \) -exec cp {}testdir \;
我们无法在-exec 参数中直接使用多个命令。它只能够接受单个命令,不过我们可以耍一个小花招。把多个命令写到一个shell 脚本中(例如command.sh ),然后在-exec中使用这个脚本(需要指定路径)。
一个例子,查找七天前修改过的文件(不包括子目录)并打印
[root@localhostfindtest]# date
ThuJul 11 18:12:41 CST 2019
#满足条件的文件
[root@localhostfindtest]# filelist=`find . -path"./testredis" -prune -o -mtime+7`
#打印或作其他处理
[root@localhostfindtest]# for i in $filelist;do echo $i;done
./test.txt
./ISBN-9787511415073.pdf
./testredis
./dump.rdb