Linux系统管理-find文件查找
find概述
为什么要使用文件查找
有些时候,我们可能会忘了某个文件所在的位置,此时就需要通过find来查找。
还有些时候,我想要找到,某个目录下,所有小于1k的文件。
还还有些时候,我们想要找到,某个目录下,7天之前创建的文件。
还还还有些时候,我们想找到,某个目录下,所有以.sh结尾的脚本。
Linux
系统中的find
命令在查找文件时非常有用而且方便。
find的作用
它可以根据不同的条件来进行查找文件:例如权限、拥有者、修改日期/时间、文件大小等等。 同时find
命令是Linux
下必须掌握的。
find 命令的基本语法如下
命令 | 路径 | 选项 | 表达式 | 动作 |
---|---|---|---|---|
find | [path…] | [options……] | [expression] | [action] |
查找 | 地区 | 工作岗位 | 投简历 | 面试 |
视频 | 路径 | 欧美 | 科幻 | 看 |
find查找示例
find根据文件名查找
-name
# 查找/etc目录下包含ifcfg名称的文件
[root@oldboy ~]# find /etc/sysconfig/ -name 'ifcfg*'
/etc/sysconfig/network-scripts/ifcfg-lo
/etc/sysconfig/network-scripts/ifcfg-eth0
# -i 忽略大小写
[root@oldboy ~]# find /etc/sysconfig/ -iname 'ifcfg*'
find根据文件类型查找
-type
f:普通文件
[root@oldboy ~]# find /tmp -type f
d:目录文件
[root@oldboy ~]# find /tmp/ -type d
/tmp/test
/tmp/test/test01
l:软链接文件
s:安全套接字文件
b:块设备文件
p:管道文件
# 多选项组合查找
-a:and 和 且
[root@oldboy ~]# find /etc/ -type d -name 'conf*' -a -name 'config'
-o:or 或 或
[root@oldboy ~]# find /etc/ -type d -name 'conf*' -o -name 'config'
!: 取反 非
[root@oldboy ~]# find /etc/ -type d ! -name 'conf*'
find根据文件大小查找
-size
+5M:查找大于5M的文件
[root@oldboy ~]# find /etc/ -type f -size +5M|xargs du -sh
-5M:查找小于5M的文件
[root@oldboy ~]# find /etc/ -type f -size -5M|xargs du -sh
5M:查找等于5M的文件
[root@oldboy ~]# find /etc/ -type f -size 5M|xargs du -sh
# 同时满足大于1M,小于5M的文件都找出来
[root@oldboy ~]# find /etc -size +1M -a -size -5M|xargs du -sh
3.8M /etc/selinux/targeted/active/policy.kern
find根据时间查找
-mtime:修改文件内容的时间
-atime:访问文件内容的时间
-ctime:修改文件元数据的时间
+7:查找7天之前的,不包含今天
[root@oldboy /tmp]# find ./ -name 'file*' -mtime +7
-7:查找7天之内的,包含今天
[root@oldboy /tmp]# find ./ -mtime -7
7:查找不包含今天,往前数第七天的
[root@oldboy /tmp]# find ./ -mtime 7
# 删除近七天之前的所有文件
[root@oldboy /tmp]# find ./ -name 'file*' -mtime +7 -delete
find根据用户来查找
-user 根据用户名查找
[root@oldboy /tmp]# find / -user ld 2>/dev/null
-group 根据组来查找
[root@oldboy /tmp]# find / -group ld 2>/dev/null
-nouser 查找没有用户的文件
-nogroup 查找没有组的文件
find按深度查找
-maxdepth
[root@oldboy /tmp]# find /etc -maxdepth 1 -type f
find根据权限查找
-perm
# 精确查找
[root@oldboy /tmp]# find / -perm 222
# 模糊匹配包含-后面的对应权限
[root@oldboy /tmp]# find ./ -perm -233|xargs stat -c %a
find的处理动作(重点)
当查找到一个文件后, 需要对文件进行如何处理, 默认动作 -print
动作 | 含义 |
---|---|
打印查找到的内容(默认) | |
-ls | 以长格式显示的方式打印查找到的内容(就近原则) |
-delete | 删除查找到的文件(就近原则,也只能删除空目录) |
-ok | 后面跟自定义shell命令(会一直提示是否操作)标准写法 -ok ; |
-exec | 后面跟自定义shell命令(标准写法-exec ;) |
# -print
[root@oldboy /tmp]# find ./ -mtime 3 -print
./file-27
# -ls
[root@oldboy /tmp]# find ./ -name 'file*' -o -name 'test*' -ls
16777294 0 -rw-r--r-- 1 root root 0 Jun 30 00:52 ./test1
#-delete
[root@oldboy /tmp]# find ./ -name 'file*' -o -name 'test*' -delete
# -ok
[root@oldboy /tmp]# find ./ -name 'file*' -o -name 'test*' -ok ls -l \;
< ls ... ./test1 > ? y
total 2716
-rw-r--r--. 1 root root 29 Jun 18 15:20 date.txt
#-exec
[root@oldboy /tmp]# find ./ -name 'file*' -o -name 'test*' -exec ls -l \; (查看了当前路径下test开头文件的详细属性)
[root@oldboy /tmp]# find ./ -name 'file*' -o -name 'test*' -exec cp {} /opt/ \; (就近原则复制,只复制了test开头的文件)
xargs结合find使用
[root@oldboy /tmp]# find ./ -name 'file*' -o -name 'test*'|xargs cp -t /opt/ (-t:颠倒源文件和目标文件的位置)(因为xargs默认把从左边接收的数据放到右边命令的最后面)
[root@oldboy /tmp]# find ./ -name 'file*' -o -name 'test*'|xargs -I {} cp {} /opt/
练习题
1.查找/tmp目录下,属主不是root,切文件名不是以f开头的文件
find /tmp ! -user root ! -name 'f*'
find /tmp ! \( -user root -a -name 'f*' \)
2.查找/var目录下属主为root,切属组为mail的所有文件
find /var -user root -group mail
3.查找/var目录下不属于root、oldboy、zls组的所有文件
find /var ! -group root -a ! -group oldboy -a ! -group zls \)
find /var \( -group root -o -group oldboy -o -group zls \)
4.查找/var目录下最近一周内其内容修改过,同时属主不为root,也不是postfix的文件
find /var -mtime -7 ! -user root -a ! -user postfix
5.查找/etc/下所有大于1M且类型为普通文件的所有文件
find /etc/ -size +1M -type f
6.将/etc中的所有目录(仅目录)复制到/tmp下,目录结构不变
[root@oldboy /tmp]# find /etc/ -type d|xargs -I {} mkdir -p /tmp/{}
7.将/etc目录复制到 /var/tmp,/var/tmp/etc的所有目录权限为777,/var/tmp/etc/目录中所有文件权限为666
[root@oldboy /tmp]# cp -r /etc /var/tmp
[root@oldboy /tmp]# find /var/tmp/etc -type d|xargs chmod 777
[root@oldboy /tmp]# find /var/tmp/etc ! -type f|xargs chmod 666
9.创建touch file{1..10}10个文件,保留file9,其他一次全部删除
[root@oldboy /tmp]# touch file{1..10}
[root@oldboy /tmp]# find ./ ! -name 'file9' -delete 2>/dev/null
10.解释如下每条命令的含义
# 在/root/下创建dir1mulu
mkdir /root/dir1
# 在/root/dir1/下创建file1……file10文件
touch /root/dir1/file{1..10}
# 在/root/dir1下 查找名字是‘file5’的普通文件
find /root/dir1 -type f -name 'file5'
# 在/root/dir1下查找除了名字是‘file5’的所有文件
find /root/dir1 ! -name 'file5'
# 在/root/dir1下查找名字是‘file5’的文件和名字是‘file9’的文件
find /root/dir1 -name 'file5' -o -name 'file9'
# 在/root/dir1下查找名字是‘file5’的文件和名字是‘file9’的文件并以详细信息的形式列出来‘file9’
find /root/dir1 -name 'file5' -o -name 'file9' -ls
# 在/root/dir1下查找名字是‘file5’的文件和名字是‘file9’的文件并以详细信息的形式列出来
find /root/dir1 (-name 'file5' -o -name 'file9' ) -ls
# 在/root/dir1下查找名字是‘file5’的文件和名字是‘file9’的文件并删除
find /root/dir1 (-name 'file5' -o -name 'file9' ) -exec rm -rvf {} \;
# 在/root/dir1下查找除了名字是‘file5’的文件和名字是‘file9’的文件并删除
find /root/dir1 ! (-name 'file5' -o -name 'file9' ) -exec rm -vf {} \;