Linux文件查找

Linux系统中的find命令在查找文件时非常有用而且方便。 它可以根据不同的条件来进行查找文件:例如权限、拥有者、修改日期/时间、文件大小等等。 同时find命令是Linux下必须掌握的。 find 命令的基本语法如下:

 find [路径] [选项] [表达式] [动作]

find查找示例:

按文件类型查找:

# f 文件
[root@localhost ~]# find /dev -type f

#d目录
[root@localhost ~]# find /dev -type d

#l链接
[root@localhost ~]# find /dev -type l

#b块设备
[root@localhost ~]# find /dev -type d

#c字符设备
[root@localhost ~]# find /dev -type c

#s套接字
[root@localhost ~]# find /etc/ -type s

#管道文件
[root@localhost ~]# find /etc/ -type p

#查看找出文件的详细信息
root@localhost ~]# find /run -type s|xargs ls

按文件大小查找

1.查找大于5M的文件
[root@localhost ~]# find /etc/ -size +5M

2.查找等于5M的文件
[root@localhost ~]# find /etc/ -size 5M

3.查找小于5M的文件
[root@localhost ~]# find /etc/ -size -5M

练习:

# 1.在/opt下创建1000个文件
# 2.使用find找出(/opt下小于1k的文件)并删除
root@localhost ~]# find /opt/ -size -1k |xargs mv -t /tmp

#将创建/opt下的文件移动到/tmp下
[root@localhost ~]# find /opt/ -size -1k |xargs -i  mv {} 
xargs -i 指定数据流的位置,将数据流放入{}中

按文件名查找:

1.创建文件
[root@localhost ~]# touch /etc/sysconfig/network-scripts/{ifcfg-eth1,IFCFG-ETH1}

2.查找/etc目录下包含ifcfg-eth1名称的文件
[root@localhost network-scripts]# find /etc -name "ifcfg-eth1"

3.-i 忽略大小写
[root@localhost network-scripts]# find /etc -iname "ifcfg-eth1"
/etc/sysconfig/network-scripts/ifcfg-eth1
/etc/sysconfig/network-scripts/IFCFG-ETH1

4.查找/etc目录下包含ifcfg-eth名称所有文件
[root@localhost network-scripts]# find /etc/ -name "ifcfg-eth*"
/etc/sysconfig/network-scripts/ifcfg-eth1
[root@localhost network-scripts]# find /etc/ -iname "ifcfg-eth*"
/etc/sysconfig/network-scripts/ifcfg-eth1
/etc/sysconfig/network-scripts/IFCFG-ETH1

按文件时间查找:

# 一个文件有以下三种时间
access time:atime
modify time:mtime
change time:ctime
# 查看三种时间[root@localhost ~]# stat a.txt

1.创建测试文件
[root@localhost ~]# for i in {01..10};do date -s 201904$i && touch file-$i;done
2019年 04月 01日 星期一 00:00:00 CST
2019年 04月 02日 星期二 00:00:00 CST
2019年 04月 03日 星期三 00:00:00 CST
2019年 04月 04日 星期四 00:00:00 CST
2019年 04月 05日 星期五 00:00:00 CST
2019年 04月 06日 星期六 00:00:00 CST
2019年 04月 07日 星期日 00:00:00 CST
2019年 04月 08日 星期一 00:00:00 CST
2019年 04月 09日 星期二 00:00:00 CST
2019年 04月 10日 星期三 00:00:00 CST

2.查找7天以前的文件,不会打印当天的文件
[root@localhost ~]# find ./ -iname "file-*" -mtime +7
./file-01
./file-02

3.查找最近7天的文件,不建议使用,会打印当天的文件
[root@localhost ~]# find ./ -iname "file-*" -mtime -7
./file-04
./file-05
./file-06
./file-07
./file-08
./file-09
./file-10

4.查找第七天的文件,不会打印当天文件
[root@localhost ~]# find ./ -iname "file-*" -mtime 7
./file-03

5.查找/var/log下所有。log结尾的文件,并且保留最近7天的log文件``
[root@localhost ~]# find /var/log  -type f -iname “*.log” -mtime +7 -delete(-type f 文件) (-iname 不区分大小写的.log文件)(-mtime7天以前的文件)(-delete删除)

按照文件用户和组查找:

1.查找属主LW
[root@localhost home]# find /home/ -user LW
[root@localhost home]# find /home/ -user LW

2.查找属主是LW,并且属组是root
[root@localhost home]# find /home/ -user LW -a -group root

3.查找属主是LW 或者属组是root
[root@localhost home]# find /home/ -user LW -o -group root

4.查找没有属组
[root@localhost home]# find /home/ -nogroup

5.查找没有属主或没有属组
[root@localhost home]# find /home/ -ngroup -o -nouser

按照文件权限查找

-perm
#精确,并输出详细信息
[root@localhost home]# find /root -type f -perm 644 -ls

#包含,并输出详细信息,每个权限位上,都要包含该数字权限的所有权限
[root@localhost ~]# find ./ -perm -622 -ls
622
rw--w--w-

# 总共三个权限位,只要有一个权限位的权限被包含,就可以找到[root@localhost ~]# find ./ -perm /644 -ls
属主权限位,有一个r或者有一个w就满足条件
属组权限位,有一个r就满足条件
其他用户权限位,有一个r就满足条件

#特殊权限,并输出详细信息
[root@localhost home]# find /root -type f -perm -4000 -ls
[root@localhost home]# find /root -type f -perm -2000 -ls
[root@localhost home]# find /root -type f -perm -1000 -ls

按照文件深度查找

-maxdepth
针对目录层级查找
# 查找/etc/目录下的所有1级和2级目录
[root@localhost ~]# find /etc  -type d  -maxdept

find动作处理

动作 含义
-print 打印查找到的内容(默认)
-ls 查看文件的详细信息
-delete 删除查找到的文件(仅仅删除空目录)
-ok 后面自定义shell命令()会提示是否操作
-exec 后面跟随自定义shell命令(标准写法-exec ;)

ps:

-ls:查看文件的详细信息 | xargs ls-l或者ls-l$(find xxx) 或者 ls-l`find xxx(bug,多条件组合时,只能看最后条件的详细信息)

-delete:删除查找到的文件(bug跟ls,ls看不见的,也删除不掉)并且只能删除空目录其他删除方法: |xargs rm-fr或者rm-fr$(find xxx)或者rm-frfind xxx

[root@localhost ~]# find / -name 'etc' -delete

find: cannot delete ‘/run/initramfs/state/etc’: Directory not empty

find: cannot delete ‘/etc’: Directory not empty

find: cannot delete ‘/var/tmp/etc’: Directory not emty

find逻辑运算符

符号 作用
-a
-o
-not 非(!)

山林不向四季起誓 荣枯随缘