Linux下find命令通常用来在指定目录下查找文件。任何位于参数之前的字符串都将被视为预查找的目录名。如果使用该命令时,不设置任何参数,则find命令将在当前目录下查找子目录与文件,并且将查找到的子目录和文件全部进行显示。
参数:find命令使用时通常有俩参数,即path和expression。如果path取空,则默认为在当前路径下查找,如果expression取空,则默认为-print。有时还使用-mount或-xdev来检查和指定目录在同一个文件系统下的文件,避免列出其他文件系统中的文件。要想知道各种参数的用法和意义,首先得知道文件的时间三属性:
访问时间(access time):more、cat、vi等命令可以改变文件的访问时间
文件数据最新的修改时间(modify time):编辑和修改文件可改变文件数据的修改时间
文件状态修改时间(change time):权限、用户组、用户的改变都可改变文件状态
常见的expression的选项有:
-type c 文件类型是c的文件,常见的c的取值有:d(目录)、c(字型装置文件)、b(区块装置文件)、 p(具名贮列)、f(一般文件)、l(符号链接文件)、s(socket文件)
-size n 文件大小是n单位的文件,n后可直接跟单位,b代表512位元组的区块,c表示字元数,k表示kilo bytes,w是2个位元组
-amin n 在过去n分钟内被读取过的文件
-answer file 比文件file更晚被读取过的文件
-atime n 在过去n天内被读取过的文件
-cmin n 在过去n分钟内被修改过的文件
-canswer file 比file文件更晚被修改过的文件
-ctime n 在过去n天内被修改过的文件
-empty 空的文件
-ipath p(-path p) 路径符合p的文件,-ipath表示忽略大小写
-iname n(-name n) 文件名符合n的文件,-iname表示忽略大小写
-pid n 进程描述符是n的文件
除此之外还可以使用如下符号将运算式分隔:
exp1 –and exp2
!expr
-not expr
exp1 –or exp2
exp1,exp2
示例:
1.查找一般文件
find ./ -type f
通常此命令查找出来的文件数目较多
2.查找目录文件
find ./ -type d
3.查找名字为Head.c的文件
find ,. –name Head.c
4.查找名字符合正则表达式(.c文件)的文件
find ./ -regex .*\.c
5.查找目录文件并列出目录下的文件(为找到的每一个目录单独执行ls命令,没有选项-print时文件列表前一行不会显示目录名称)
find ./ -type –print –exec ls {} \;
6. 查找目录文件并列出目录下的文件(为找到的每一个目录单独执行ls命令,执行命令前需要确认)
find ./ -type d -ok ls {} \;
7. 查找目录文件并列出目录下的文件(将找到的目录添加到ls命令后一次执行,参数过长时会分多次执行)
find ./ -type d -exec ls {} +
8.查找文件名匹配*.c的文件
find ./ -name \*.c
9.打印Head.c文件名后,打印该文件内容
find ./ -name Head.c -print -exec cat {} \;
10.不打印Head.c文件名,只打印该文件内容
find ./ -name Head.c -exec cat {} \;
11.查找文件更新日在距现在时刻2天以内的文件
find ./ mtime -2
12.查找文件更新日在距现在时刻2天以上的文件
find ./ mtime +2
13. 查找文件更新日在距现在时刻1天以上2天以下的文件
find ./ mtime 2(查找结果为空,因为本机上没有符合条件的文件)
14. 查找文件更新日在距现在时刻2分以内的文件
find ./ -mmin -2
15. 查找文件更新日在距现在时刻2分以上的文件
find ./ -mmin +2
16. 查找文件更新日在距现在时刻1分以上2分以内的文件
find ./ -mmin 2
17.查找文件更新时间比文件Head.c的内容更新时间新的文件
find ./ newer Head.c
18.查找文件访问时间比文件Head.c的内容更新时间新的文件
find ./ answer Head.c
19.查找空文件或空目录
find ./ -empty
20.查找空文件并删除
find ./ -empty –type f –print –delete
21.查找权限为644的文件或目录
find ./ -perm 664
22.查找用户/组权限为读写,其他用户权限为读的文件或目录
find ./ -perm -664
23.查找用户有写权限或者组用户有写权限的文件或mu路
find ./ -perm /220
find ./ -perm /u+w,g+w
find ./ -perm /u=w,g=w
24.查找所有者权限有读权限的目录或文件
find ./ -perm –u=r
25.查找用户组权限有读权限的目录或文件
find ./ -perm –g=r
26.查找其他用户权限有读权限的目录或文件
find ./ -perm –o=r
27.查找所有者为jx的文件或目录
find ./ -user jx
28.查找组名为jx的文件或目录
find ./ -group jx
29.查找文件的用户ID不存在的文件
find ./ -nouser
30.查找文件的用户ID不存在的文件
find ./ -nogroup
31.查找有执行权限但没有可读权限的文件
find ./ -executable \! –readable
32.查找文件大小小于10个字节的文件或目录
find ./ -size -10c
33.查找文件大小等于10个字节的文件或目录
find ./ -size 10c
34.查找文件大小大于10个字节的文件或目录
find ./ -size +10c
35.查找文件大小小于10k的文件或目录
find ./ -size -10k
36.查找文件大小小于10M的文件或目录
find ./ -size -10M
37. 查找文件大小小于10G的文件或目录
find ./ -size -10G
考题:
find /home/UFE/Signal/ -name “*.c” | xargs wc –l
该命令为find和wc的结合命令,把find命令的结果作为wc命令的操作对象,这主要归功于管道和xargs命令。find命令的结果通过管道变成了xargs命令的输出,而xargs命令又把它的输入当作参数传递给了wc命令,所以起到了统计多个文件代码行数的效果。
1.find下统计一个目录下的文件个数以及代码总行数
知道指定后缀名的文件总个数命令
find ./ -name “*.c” | wc -l
知道一个目录下代码行总数以及单个文件行数
find ./ -name “*.c” | xargs wc –l
2.统计文件夹中文件数目
ls –l | grep “^-” | wc –l
ls –l以长列表形式输出该目录下文件(包括目录、链接、设备文件等)信息。如果使用ls –lR | grep “^-” | wc –l则可以连子目录下的文件一起统计。grep ^-将长列表输出信息过滤一部分,只保留一般文件,如果只保留目录文件就是grep ^d。wc –l统计输出信息的行数,因为已经过滤掉了其他文件,只剩下一般文件了,所以统计结果就是一般文件信息的行数,又由于一行信息对应一个文件,所以也就是文件的个数。
find ./ -type f | wc –l
由于此命令会默认去子目录查找,如果只想查找当前目录下的文件可用find ./ -maxdepth1 –type f | wc –l
3.查找更改时间比f1新但是比f2旧的文件
find –newer f1 !f2
4.xargs是给命令传递参数的一个过滤器,可以将前一个命令产生的结果作为后一个命令de 输入参数。比如,find ./ -name “.txt” | xargs em –rf,即将find产生的输出(当前目录下的所有的txt文件)作为rm的参数,从而完全删除。