AI智能
改变未来

『学了就忘』Linux基础命令 — 30、find命令详细说明

[toc]

1、find命令的基本信息

  • 命令名称:
    find
  • 英文原意:
    search for files in a directory hierarchy
  • 所在路径:
    /bin/find
  • 执行权限:所有用户。
  • 功能描述:在目录中搜索文件。

find

命令格式:

[root@localhost ~ # find 搜索路径 [选项] 搜索内容选项:-name:按照文件名搜索-iname:按照文件名搜索,不区分文件名大小写-inum:按照inode号搜索

2、find命令基本使用

# 1.find命令基本使用# 按照文件名搜索[root@192 ~]# find . -name abcde./abcde# 提示:搜索位置越大,消耗系统资源越多。# 在生产服务器上搜索的时候,尽量不在根目录下搜索,把搜索的范围尽量控制在最小。# 2.-iname[root@192 ~]# find . -iname abcde./ABCDE./abcde# 提示:i表示忽略的意思,就是忽略大小写。# 3.-inum# 之前我们通过文件名可以查看到文件的i节点号[root@192 ~]# ls -i abcde1043285 abcde# 这里通过find命令的-inum选项可以实现,通过i节点号查看文件的名字。[root@192 ~]# find . -inum 1043285./abcde# 这两个是一对命令,记忆比较方便。

扩展:之前我们说过,硬连接是非常不好识别链接,源文件和硬链接文件只是引用计数增加了,其他信息是无法识别的。如下:

[root@192 ~]# ls -il abcde /tmp/abcde_h1043285 -rw-r--r--. 2 root root 0 12月 30 18:24 abcde1043285 -rw-r--r--. 2 root root 0 12月 30 18:24 /tmp/abcde_h

我们可以看到硬连接文件和源文件的

i

节点号是一样的。我们可以通过

i

节点号来查询是否有多个文件与之对应。Linux系统中是一个文件对应一个

i

节点号,如果有多个文件对应一个

i

节点号,说明存在硬连接关系。

[root@192 ~]# find / -inum 1043285find: “/proc/39609/task/39609/fd/5”: 没有那个文件或目录find: “/proc/39609/task/39609/fdinfo/5”: 没有那个文件或目录find: “/proc/39609/fd/5”: 没有那个文件或目录find: “/proc/39609/fdinfo/5”: 没有那个文件或目录/tmp/abcde_h/root/abcde

我们可以看到,通过上边这种方式是可以确定两个文件是硬链接关系。但是我们在平时使用Linux系统的时候,还是不推荐创建文件的硬链接。

补充:上边代码块的前4行是干扰项。这是在整个根目录搜索的时候,会搜索到

proc

目录,而

proc

目录是内存,

find

命令在运行的时候,就会消耗一定的内存资源,这4行就是

find

命令在运行时产生的临时文件。同时这种临时文件找到也是立刻消失的,所以会出现每行最后的**“没有那个文件或目录”**。

3、按照文件大小搜索

[root@localhost ~]# find 搜索路径 [选项] 搜索内容选项:-size[+|-]大小:按照指定大小搜索文件

提示:这里的

+

的意思是搜索比指定大小还要大的文件,

-

的意思是搜索比指定大小还要小的文件。

(1)find 命令的单位:

[root@localhost ~ ] # man find-size n[cwbkMG]File uses n units of space.The following suffixes can be used:#这是默认单位,如果单位为b或不写单位,则按照512 Byte搜索。\' b\':for 512-byte blocks(this is the default if no suffix is used)#搜索单位是c,按照字节搜索。\'c\':for bytes#搜索单位是w,按照双字节(中文)搜索。\'w\':for two-byte words#按照KB单位搜索,必须是小写的k。\'k\':for Kilobytes(units of 1024 bytes)#按照MB单位搜索,必须是大写的M\'M\':for Megabytes(units of 1048576 bytes)#按照GB单位搜索,必须是大写的G\' G\':for Gigabytes(units of 1073741824 bytes)

(2)示例:

# 1.查看root目录下文件信息[root@DevOps ~]# ll -h总用量 48K-rw-r--r--. 1 root root   17 1月   9 17:08 abc-rw-------. 1 root root 1.3K 12月 23 20:46 anaconda-ks.cfg-rw-r--r--. 1 root root  28K 12月 23 20:46 install.log-rw-r--r--. 1 root root 7.4K 12月 23 20:45 install.log.syslog# 2.在当前目录下搜索文件大小为28k的文件[root@DevOps ~]# find . -size 28k./install.log# 3.在当前目录下搜索文件大小大于1k的文件。[root@DevOps ~]# find . -size +1k../install.log./anaconda-ks.cfg./install.log.syslog# 注意:具体单位字母看上边列表。# 4.注意一个小问题# 如果按文件大小搜索,并且文件的大小没有写单位,默认是按b(字节)进行查找的,但是我们可以看到下面并没有查询处abc文件。[root@DevOps ~]# ll -h总用量 48K-rw-r--r--. 1 root root   17 1月   9 17:08 abc-rw-------. 1 root root 1.3K 12月 23 20:46 anaconda-ks.cfg-rw-r--r--. 1 root root  28K 12月 23 20:46 install.log-rw-r--r--. 1 root root 7.4K 12月 23 20:45 install.log.syslog[root@DevOps ~]# find . -size 17[root@DevOps ~]## 原因是:# 看上边的单位说明` \' b\':for 512-byte blocks(this is the default if no suffix is used)`# 说b默认单位是按照512byte查找,这是一个默认的属性值,如上边我们输入的17,就是17*512b的结果进行计算,然后进行查找。# `c`是按照字节搜索。[root@DevOps ~]# find . -size 17c./abc

4、按照修改时间搜索

Linux中的文件有访问时间(

atime

数据修改时间(

mtime

、**状态修改时间(

ctime

)**这三个时间,我们也可以按照时间来搜索文件。

注意:如果以

time

结尾的时间单位,默认单位时间是天。

命令格式如下:

[root@localhost ~ ] # find 搜索路径 [选项] 搜索内容选项:-atime[+|-]时间:按照文件访问时间搜索-mtime[+|-]时间:按照文件数据修改时间搜索-ctime[+|-]时间:按照文件状态修改时间搜索

提示:也有

-amin

-mmin

等时间选项,时间单位为分钟。

mtime

数据修改时间来举例,重点说说

+

-

时间的含义。

我们画一个时间轴,来解释一下,如下图:

说明:

  • -5

    :代表5天内修改的文件。

  • 5

    :代表前5~6天,那一天修改的文件。

  • +5

    :代表6天前修改的文件。

5、按照权限搜索

命令格式如下:

[root@localhost ~]# find 搜索路径 [选项] 搜索内容选项:-perm: 权限模式:查找文件权限刚好等于“权限模式”的文件-perm: -权限模式:查找文件权限全部包含“权限模式”的文件-perm: +权限模式:查找文件权限包含“权限模式”的任意一个权限的文件

举例:

# 1.查看文件夹内容[root@DevOps test]# ll总用量 0-rw-r--r--. 1 root root 0 1月   9 18:17 abc-rw-r--r--. 1 root root 0 1月   9 18:17 def# 2.按照权限查找文件[root@DevOps test]# find . -perm 644./def./abc# 注:644代表权限rw-r--r--# 3.修改文件def权限为600,然后进行+、-查找[root@DevOps test]# chmod 600 def[root@DevOps test]# ll总用量 0-rw-r--r--. 1 root root 0 1月   9 18:17 abc-rw-------. 1 root root 0 1月   9 18:17 def# 查找[root@DevOps test]# find . -perm +444.(代表当前目录不用考虑)./def./abc[root@DevOps test]# find . -perm -444../abc[root@DevOps test]#

说明:

  • 如果是
    +

    ,代表所有者,所属组,其他人这三个权限中,只要有一个权限大于搜索的权限,就能够找到该权限。

  • 如果是
    -

    ,代表三个权限都要满足每项权限,如

    abc

    文件的权限是644,每个权限全都大于444,所以被搜索到。

  • 总结:
    +

    就是三个权限满足一个即可,

    -

    三个全满足才可以。

提示:

find

的权限搜索,能理解就好,

+

-

工作中一般用不太多。

6、按照所有者和所属组搜索

命令格式如下:

[root@localhost ~]# find 搜索路径 [选项] 搜索内容选项:-uid 用户ID:按照用户ID查找所有者是指定ID的文件-gid组ID:按照用户组ID查找所属组是指定ID的文件-user用户名:按照用户名查找所有者是指定用户的文件-group组名:按照组名查找所属组是指定用户组的文件-nouser:查找没有所有者的文件

举例:

# 按照所有者查找文件[root@DevOps test] # find . -user root../def./abc

提示:

  • (重要)上边这种方式并不常用,在按照所有者和所属组搜索时,
    -nouser

    选项比较常用,主要用于查找垃圾文件。

  • (重要)只有一种情况例外,那就是外来文件。比如光盘和U盘中的文件如果是由Windows复制来的(也就是文件是由Windows建立的),在Linux中查看就是没有所有者的文件;再比如手工源码包安装的文件,也有可能没有所有者(由其他系统打的源码包)。
  • 除了外来文件,Linux系统下所有的文件都应该有所有者,否则至少是一个垃圾文件。是需要用户来处理掉的。

而关于所有者和所属组搜索常用的命令为:

[root@DevOps test] # find / -nouserfind: “/proc/5244/task/5244/fd/5”: 没有那个文件或目录find: “/proc/5244/task/5244/fdinfo/5”: 没有那个文件或目录find: “/proc/5244/fd/5”: 没有那个文件或目录find: “/proc/5244/fdinfo/5”: 没有那个文件或目录

注意:这四行之前说过,是

find

命令在执行时,在内存中自己产生的临时文件,执行完既消失。上边命令结果证明Linux系统中没有垃圾文件。

7、按照文件类型搜索

命令格式如下:

[root@localhost ~]# find 搜索路径 [选项] 搜索内容选项:-type d:查找目录-type f:查找普通文件-type l:查找软链接文件

举例

# 查找当前文件中的目录[root@DevOps ~]# find . -type d../test# 其他选项同理。

8、逻辑运算符

find

命令支持一些复杂的搜索方式:逻辑与、逻辑或、逻辑非

命令格式如下:

[root@localhost ~]# find 搜索路径 [选项] 搜索内容选项:-a:and逻辑与-o:or逻辑或-not:not 逻辑非

(1)-a:and逻辑与

find

命令也支持逻辑运算符选项,其中

-a

代表逻辑与运算,也就是

-a

的两个条件都成立,

find

搜索的结果才成立(其中有一个不成立都不行)。

举个例子:

# 在当前目录下搜索大于2KB,并且文件类型是普通文件的文件[root@localhost ~]# find . -size +2k -a -type f

(2)-o:or逻辑或

-o

选项代表逻辑或运算,也就是

-o

的两个条件只要其中一个成立,

find

命令就可以找到结果。

举个例子:

# 在当前目录下搜索文件要么是cangls的文件,要么是bols的文件,两个都可以搜索到。[root@localhost ~]# find . -name cangls -o -name bols./cang1s./bols

(3)-not:not 逻辑非

not

是逻辑非,也就是取反的意思。

举个例子:

# 在当前目录下搜索文件名不是cangls的文件[root@localhost ~]# find . -not -name cangls# 下面!的写法和上边-not是一个意思,都是逻辑非运算符。[root@localhost ~]# find . ! -name cangls# (注意!左右两边都有要空格)

9、其他选项

这里我们主要讲解两个选项

-exec

-ok

,这两个选项的基本作用非常相似。

我们先来看看

-exec

选项的格式。

(1)-exec选项

[root@localhost ~]# find 搜索路径 [选项] 搜索内容 -exec 命令2 {} \\;

说明:

  1. 基本格式,只要写
    -exec

    ,命令最后一定要写

    \\;

  2. 作用是,把命令1的搜索结果(
    find 搜索路径 [选项] 搜索内容

    ),作为命令2的操作对象。(其实可以理解成把命令1的操作结果,放在命令2后边的

    { }

    中,然后用命令2去搜索

    { }

    中的内容。)

  3. 在命令2种不识别别名,就是在命令2种不能用别名,如果
    ll

    命令。

(2)-ok选项

-ok

选项和

-exec

选项的作用基本一致,区别在于:

-exec

的命令2会直接处理,而不询问;

-ok

的命令2在处理前会先询问用户是否这样处理,在得到确认命令后,才会执行。

示例如下:

# 在删除自己产生的一些零时文件,且很久不用的时候,可以用下面命令删除。[ root@ localhost ~] # find /var/log -mtime +10 -ok rm -rf 0\\;〈 rm.../var/log/samba/old〉?n〈 rm.../var/log/sssd〉?n〈 rm...I/var/log/ntpstats〉?n〈 rm.../var/log/cups〉?n
赞(0) 打赏
未经允许不得转载:爱站程序员基地 » 『学了就忘』Linux基础命令 — 30、find命令详细说明