Linux常用命令 | find

935 阅读5分钟

作者简介

李先生(Lemon),高级运维工程师(自称),SRE专家(目标),梦想在35岁买一辆保时捷。喜欢钻研底层技术,认为底层基础才是王道。一切新技术都离不开操作系统(CPU、内存、磁盘)、网络等。坚持输入输出,记录自己学习的点滴,在平凡中坚持前行,总有一天会遇见不一样的自己。公众号:运维汪(ID:Leeeee_Li)。

一、前言

自己平时比较喜欢记笔记,工作四五年,笔记上千篇。最近离职了,加上职场瓶颈,准备好好复盘和整理一下相关的笔记、梳理一下知识点,可能后面有一系列的博文输出,从基础到进阶。

二、find命令

find命令是Linux系统管理员工具库中最强大的工具之一,可以使用find命令根据权限、类型、日期、所有权、大小等搜索文件和目录,它还可以与grep或sed等其他工具结合使用。

语法:

find [options] [path...] [expression]

三、实践

1、按文件名查找

find / -name access.log

2、通过扩展名查找文件

find . -name “*.txt” #在当前目录下查找所有txt后缀文件

3、按权限查找文件

find . -perm 755 -print  #查找当前目录下755权限的文件 
find . -perm -007 -print #查找所有用户都可以读、写、执行的文件

4、按所有者查找文件

find ~ -group lile -print    #查找~目录下所属者为lile的文件
find /home -group -print     #查找属主账户已经被删除的文件,查找在/etc/passwd里已经没有了的账户
find ~ -user lile -print     #查找~目录下所属者为lile的文件
find /home -nouser -print    #查找属主账户已经被删除的文件,查找在/etc/passwd里已经没有了的账户

5、按修改日期查找文件

find . -mtime -3 -print  #查找更改时间在3天之内的文件
find . -mtime -2 -print  #查找更改时间在2天之前的文件

6、按类型查找文件

find . -type d -print   #查找当前目录下的所有目录
find . ! -type d -print #查找当前目录下除了目录的其他所有类型文件

7、按大小查找文件

find . -size 100c -print 查找当前目录下文件长度为100字节的文件
find . -size +1000000c -print 查找当前目录下文件大于1M字节的文件
find . -size +10 -print 查找当前目录下超过10块的文件(1块=512字节)

8、排除某个目录

find /shell -path "/shell/tt" -prune -o -print                 #查找在/shell目录下除了tt目录的其他
find /shell -path "/shell/tt" -prune -o -name "*.txt" -print   #查找在/shell目录下除了tt目录的txt文件 

9、目录与文件查找顺序

find /shell -depth -print

#有dept:先处理目录下的子内容,再处理目录本身
#无dept:先处理目录本身,然后处理目录下的子内容

10、正则查找

find . -name "[A-Z]*" -print    #查找当前目录及子目录中查找文件名以大写字母开头的文件
find . |xargs grep "YZS"        #查找某个文件夹下面的哪些具体文件包含某一个字段
find . -regextype "posix-egrep"  -regex ".*\.(cc|h)" |xargs cat |grep -v ^$ |wc -l

11、查找并对结果做相关操作

find . -type l -exec ls -l {} \;                                            #找到为文件类型为软连接的文件
find . -type f -print | xargs file                                          #文件分类
find / -name "core*" -print | xargs echo "">/tmp/core.log                   #找到内存信息转储文件coredump,然后保存到/tmp/core.log下
find . -name "*.txt" -print0 | xargs -0 rm -rf                              #找到后删除,慎用
find / -path '/etc/ssl/certs' -prune -o -name *.pem | xargs -i cp {} ./pem  #找到后并拷贝
cat file.txt | xargs                                                        #将多行转换成单行
cat file.txt | xargs -n 3                                                   #指定每行的参数数量  每次执行需要x个参数
echo "splitXsplitXsplitXsplit" |xargs -d X                                  #用自己指定的分隔符进行分割
echo "splitXsplitXsplitXsplit" |xargs -d X -n 2                             #用自己指定的分隔符进行分割,并且指定每行输出的数量
cat args |xargs -I {} bash cecho.sh p {} 1                                  #从cat里读取数据,每读到一个就替换一次

12、匹配多个文件

find . \(  -name "*.txt" -o -name "*.pdf" \)

13、find排除某个目录

find / -path '/etc/ssl/certs' -prune -o -name *.pem #find 查找路径  -path '排除目录路径' -prune -o ....

四、find时间点问题

find与时间有关的选项有-atime(访问时间)、-ctime(创建时间)、-mtime(属性修改时间),参数为后面跟的时间n;

find . -atime n     这里的n表示n天之前的“一天之内”被访问过的文件

find . -atime +n   列出在n天之前(不包含n天本身)被访问过的文件

find . -atime -n    列出在n天之内(包含n天本身)被访问过的文件

实例:

假如现在的时间点为20171209的15:00整,那么下面几个查询表示的具体时间范围

1:创建文件

touch -a -d "2021-01-01 15:00" a.txt
touch -a -d "2021-01-02 15:00" b.txt
touch -a -d "2021-01-03 15:00" c.txt
touch -a -d "2021-01-04 15:00" d.txt
touch -a -d "2021-01-05 15:00" e.txt
touch -a -d "2021-01-06 15:00" f.txt
touch -a -d "2021-01-07 15:00" g.txt
touch -a -d "2021-01-08 15:00" h.txt

2:以下三条命令得到的结果分别为:

find . -atime 2****找出两天之前的一天内被访问文件(距离现在的-72小时 ~~ -48小时之间)


find . -atime -2  找出距离此时两天之内的被访问的文件(距离现在的前48小时之内)



find . -atime +2    找出两天之前,不包括两天之前的一天(也就是不包括-2和2的)之前的被访问的文件(离此时72小时之前)

3、图形分析