文件查找常用场景:
- 忘记文件所在的具体位置,根据文件名模糊查询。
- 查找
N
天前的日志并删除,释放磁盘空间。
find
命令可以根据不同的条件来进行查找文件。我们可以根据文件名称、文件大小、文件修改时间、属主属组、权限等方式查找相应的文件。
find基本用法
find
命令的基本语法:
命令 | 路径 | 选项 | 表达式 | 动作 |
---|---|---|---|---|
find | [path] | [options] | [expression] | [action] |
查找 | 地区 | 美食 | 火锅 | 下单 |
按文件名称查找
|
|
在当前目录下查找名称以ifcfg
开头的文件。
|
|
在当前目录下查找名称以iFC
开头的文件,不区分大小写。
|
|
按文件类型查找
查找文件,f
表示文件类型。
|
|
查找目录,d
表示目录类型。
|
|
查找链接文件,l
表示链接类型。
|
|
查找块设备,b
表示块设备类型。
|
|
查找字符设备,c
表示字符设备类型。
|
|
查找套接字,s
表示套接类型。
|
|
按文件大小查找
在/etc
下查找大于5M
的文件。
|
|
在/etc
下查找小于5M
的文件。
|
|
在/etc
下查找大小为5M
的文件(四舍五入)。
|
|
按修改时间查找
如图,假设当前日期是31
号,向前推7
天(不包括当前日期)为24
号,24
号以前的日期用+7
表示,24
号之后的日期用-7
表示,24
号当天用7
表示。
创建文件并修改当前时间。
|
|
查找第7
天的文件。
|
|
筛选出7
天之前的文件。
|
|
筛选出最近7
天的文件。
|
|
保留最近7
天的文件。
|
|
按用户和组查找
查找属主是snoopy
的文件。
|
|
查找属组是snoopy
的文件。
|
|
查找属主是snoopy
,属组也是snoopy
的目录。
|
|
查找没有属主的文件。
|
|
查找没有属组的文件。
|
|
查找没有属主和属组的文件。
|
|
查找文件内容
记得文件的内容是什么,但是不清楚文件名称是什么,也不知道路径在哪,怎么办?
|
|
通过grep
也可以实现。
|
|
逻辑运算
符号 | 作用 |
---|---|
-a | 与 |
-o | 或 |
! | 非,同-not |
查找/home
目录下,属主不是root
的所有文件。
|
|
查找/home
目录下,属主属于snoopy
,并且大小大于1k
的文件。
|
|
处理动作
查找到一个文件后,需要对文件进行如何处理。
动作 | 含义 |
---|---|
打印查找到的内容。 | |
-ls | 以长格式方式显示查找到的内容。 |
-delete | 删除查找到的文件,仅能删除文件和空目录。 |
-exec | 自定义shell命令。 |
当我们想查找/var/log/
目录下7
天以前的日志文件并删除,可通过以下方式实现:
方式一:
|
|
方式二:
|
|
方式三:
|
|
以上三种方式首选通过xargs
连接处理动作,此方式处理速度最快,会批量把文件传给处理命令。
次选exec
连接处理动作,此方式处理速度次之,会把逐个文件传给处理命令。
不推荐使用delete
删除文件,此方式仅能删除文件和空目录。
练习
-
查找
/var
目录下,属主不是root
,且文件名不以f
开头的文件。1
[root@localhost ~]# find /var ! -user root ! -name "f*" -type f
-
查找
/var
目录下属主为root
,且属组为mail
的所有文件。1
[root@localhost ~]# find /var -user root -group mail -type f
-
查找
/var
目录下不属于root
、lp
的所有文件。1
[root@localhost ~]# find /var/ ! -user root ! -user lp -type f
-
查找
/var
目录下最近一周内其内容修改过,同时属主不为root
,也不是postfix
的文件。1
[root@localhost ~]# find /var/ -mtime -7 ! -user root ! -user postfix -type f
-
查找
/etc
目录下大于1M
且类型为普通文件的所有文件。1
[root@localhost ~]# find /etc/ -type f -size +1M
-
将
/etc/
中的所有目录(仅目录)复制到/tmp
下,目录结构不变。1 2 3 4
[root@localhost ~]# find /etc/ -type d | xargs -i mkdir -p /tmp/{} # -i 表示 find 传递给xargs的结果 由{}来代替 或者 [root@localhost ~]# find /etc/ -type d -exec mkdir -p /tmp/{} \;
-
将
/etc
目录复制到/var/tmp/
目录下,并查找/var/tmp/etc
中的所有权限为777
的目录和权限666
的文件。1 2 3 4 5 6
[root@localhost ~]# cp /etc/ /var/tmp/ -rp [root@localhost ~]# find /var/tmp/etc/ -type d | xargs -i chmod 777 {} [root@localhost ~]# find /var/tmp/etc/ -type f | xargs -i chmod 666 {} 或 [root@localhost ~]# find /var/tmp/etc/ -type d -exec chmod 777 {} \; [root@localhost ~]# find /var/tmp/etc/ -type f -exec chmod 666 {} \;
-
保留
/var/log/
下最近7天的日志文件,其他全部删除。1
[root@localhost ~]# find /var/log/ -mtime +7 -type f | xargs rm -rf
-
创建
touch file{1..10}10
个文件, 保留file9
,其他一次全部删除。1
[root@localhost ~]# find ./ ! -name "file9" -name "file*" | xargs rm -rf
-
解释如下每条命令含义。
1 2 3 4 5 6 7 8 9
mkdir /root/dir1 touch /root/dir1/file{1..10} find /root/dir1 -type f -name "file5" find /root/dir1 ! -name "file5" find /root/dir1 -name "file5" -o -name "file9" find /root/dir1 -name "file5" -o -name "file9" -ls find /root/dir1 \( -name "file5" -o -name "file9" \) -ls find /root/dir1 \( -name "file5" -o -name "file9" \) -exec rm -rvf {} \; find /root/dir1 ! \( -name "file4" -o -name "file8" \) -exec rm -vf {} \;