- 首页
- 正文
Linux下的find命令详解
Linux的find命令用于查找指定目录和文件,虽然用法有点复杂,但功能强大,非常值得去学习,在这里总结一下常用的用法,希望能对大家有用,下面将举例来说明
find 命令的格式
find [路径..] [表达式..] [搜索后的处理动作...]
路径
:没有说指明就是当前的路径
表达式
:
- -name '文件名' # 精准匹配文件名
- -iname '文件名' # 精准匹配文件名,但不区分大小字
- -type 类型 # 指定搜索的类型(
后面详细说各种类型
) - -uid UID # 根据
UID
查找 - -gid GID # 根据
GID
查找 - -user 用户名 # 查找属主的文件
- -group 组名 # 查找属于组的文件
- -nouser # 查找没有属主的文件
- -nogroup # 查找没有属于组的文件
- -size [+|-] [k,M,G] # 根据文件大小查找
- -perm mode # 根据权限查找 (
后面详细说各种时间
) - -m[min|time] # 根据时间查找 (
后面详细说各种时间
) - -a -o -not # 组合条件
后面详细说明
精准匹配文件名
格式
$ find 路径 -name "文件名"
举例
查找在当前目录下精准匹配 test 的文件或者目录
$ find . -name "test"
查找在当前目录下以 test 开头的文件或者目录 ( 包括 test 文件或者目录 )
$ find . -name "test*"
查找在当前目录下以 test 结尾的文件或者目录 ( 包括 test 文件或者目录 )
$ find . -name "*test"
查找在 /usr/ 目录下包含 test 的文件或者目录 ( 包括 test 文件或者目录 )
$ find /usr/ -name "*test*"
查找在当前目录下精准匹配 test 的文件或者目录 ,但不区分大小写
,使用 -iname
$ find . -iname "test"
指定搜索的类型
格式
$ find 路径 -type 类型
上面的类型有以下几种:
- d : 目录
- f : 文件
- s : 套接字
- b : 块文件
- l : 符号链接文件
- p : 管道
- c : 字符
举例
在 /var/www
目录下查找所有目录,但不包括文件
$ find /var/www -type d
在 /var/www
目录下查找所有文件,但不包括目录
$ find /var/www -type f
在 /var/www
目录下查找目录深度最大为 2
的所有目录,但不包括文件
$ find /var/www -type d -maxdepth 2
在 /home
目录下精准匹配 test
的所有文件
$ find /home -name "test" -a -type f
根据 UID 查找
格式
$ find 路径 -uid UID
举例
在当前目录下查找所有uid
为 0 的文件或者目录
$ find . -uid 0
根据 GID 查找
格式
$ find 路径 -gid GID
举例
在当前目录下查找所有gid
为 0 或者 uid
为 1000 的文件或者目录
$ find . -gid 0 -o -uid 1000
查找属主的文件
格式
$ find 路径 -user 用户名
举例
在当前目录下查找用户名为 root
的文件或者目录
$ find . -user root
查找属于组的文件
格式
$ find 路径 -group 组名
举例
在当前目录下查找组名为 root
的文件或者目录
$ find . -group root
查找没有属主的文件
格式
$ find 路径 -nouser
举例
在当前目录下查找没有用户名的文件或者目录
$ find . -nouser
注意:把当前用户删除属主和属组就会是一串数字,之前属于这个用户的文件,这个时候是没有属主和属组的
查找没有属于组的文件
格式
$ find 路径 -nogroup
举例
在当前目录下查找没有组名的文件或者目录
$ find . -nogroup
注意:把当前用户删除属主和属组就会是一串数字,之前属于这个用户的文件,这个时候是没有属主和属组的
根据文件大小查找
格式
$ find 路径 -size [+|-] [k, M, G]
举例
在 /home
目录下查找大于 100MB 的文件
$ find /home -type f -size +100M -exec ls -lh {} \;
在 /etc
目录下查找小于 10k 的文件
$ find /etc -type f -size -10k -exec ls -lh {} \;
在 /
目录下查找等于 1G 的文件
$ find / -type f -size 1G -exec ls -lh {} \;
根据权限查找
格式
$ find 路径 -perm mode
注意:
mode 的方式有以下几种比较常用的
- mode 精确的匹配
- -mode 要包含这个mode的所有位(可以说是每个位都要大于这个mode的每一位)
- /mode 只要匹配任何一个权限位就可以
举例
在 /etc
目录下查找mode位为600的文件或者目录
$ find /etc -perm 600
在 /home
目录下查找深度为 1
并且包含mode位为664的文件或者目录
$ find /home -maxdepth 1 -perm -600
在 /home
目录下查找深度为 1
并且其它用户具有执行的文件或者目录
$ find /home -maxdepth 1 -perm /001
根据时间查找
格式
$ find 路径 -[a|c|m][min|time] [+|-]time
注意:
根据时间查找有几种组合:
- -amin 多少分钟访问过
- -cmin 多少分钟改变过
- -mmin 多少分钟修改过
- -atime 多少天访问过
- -ctime 多少天改变过
- -mtime 多少天修改过
根据时间的加减也有方式:
- -amin +10 至少10分钟没有访问过
- -amin 10 刚好10分钟之前访问过
- -atime -10 在10分钟之内有访问过
举例
在 /home
目录下查找在至少1天没有访问过的文件或者目录
$ find /home -atime +1
在 /home
目录下查找在刚好30分钟之前访问过的文件或者目录
$ find /home -amin 30
在 /home
目录下查找在在1小时之内访问过的文件或者目录
$ find /home -amin -60
注意:可以使用 stat 文件或者目录
来查看文件的各种属性
组合条件
格式
$ find 路径 条件 [-a -o -not] 条件
举例
在 /etc
目录下查找属主为 test1
并且文件小于 100k
的文件
$ find /etc -type f \( -user test1 \) -a \( -size -100k \)
在 /home
目录下查找没有属主或者没有属组的目录
$ find /etc \( -type d -a -nouser \) -o \( -type d -a -nogroup \)
在 /home
目录下查找不是用户 test1
并且不是用户 test2
的文件
$ find . \( -not -user test1 \) -a \( -not -user test2 \) # 或者 find . -not \( -user test1 -o -user test2 \)
搜索后的处理动作
:有下面几种方式:
- -print,不写就是这种方式
- -exec 命令 {} \; 执行命令,{} 代表搜索到的文件或者目录
- -ok 命令 {} \; 跟 -exec 一样,只不过,执行命令要手动确认
- -ls 相当于 ls -l命令
举例
在 /var
目录下查找深度为 1
并且用户为 user1
的还有属组有写权限的目录
$ find /var -maxdepth 1 -type d \( -user user1 \) -a \( -perm /020 \) -print
在 /home
目录下查找深度为 2
并且大于10M的还有其它组具有执行权限的目录或者文件删除掉
$ find /home -maxdepth 2 \( -size +10M \) -a \( -perm /002 \) -exec rm -rf {} \;
在 /home
目录下查找深度为 5
并且至少有一个月没有访问还有其它组具有执行权限的目录或者文件删除掉,但每删除一个文件都要确认
$ find /home -maxdepth 5 \( -atime +30 \) -a \( -perm /002 \) -ok rm -rf {} \;
在当前目录下查找深度为 1
并且以 txt
后缀结尾的文件或者目录,并能查看文件或者目录的各种属性
find . -maxdepth 1 -name "*.txt" -ls