Linux文件查找

Linux文件查找

无论是Windows系统还是Mac系统,几乎各个操作系统基本都有提供文件搜索的功能,Linux也不例外。在linux上文件搜索主要使用两个命令,一个是基于本地数据库的locate,数据库的更新是有延迟的,因此该种搜索方式速度快,但是不是实时搜索;另一种搜索的命令是find,该种搜索方式是实时的。

locate

作用

locate - find files by name. locate reads one or more databases prepared by updatedb(8) and writes file names matching at least
one of the PATTERNs to standard output, one per line.

locate可以通过名称来查找文件。locate读取通过updatedb指令生成数据的一个或者多个数据库,根据匹配的模式输出文件地址。

语法

locate [OPTION]... PATTERN...

其中常用Option有:

  • -i, 不区分大小写
  • -l N, 取前面几条
  • -r, 使用正则表达式进行匹配
# 搜索passwd文件
~]# locate passwd
/etc/passwd

# 在home目录创建f1_test.txt然后搜索
]# touch ~/f1_test.txt
]# locate f1_test.txt

# 刚创建的文件直接搜索,未能搜索出来
# 使用updatedb,更新数据库,然后重新搜索, 发现搜索出来了结果
]# updatedb
]# locate f1_test.txt
/root/f1_test.txt

find实时搜索文件

find - search for files in a directory hierarchy

在目录层级中搜索文件。

Usage

语法如下:

find [OPTIONS].. [查找路径] [表达式] [执行操作]

查找路径

当查找路径为空时,则默认使用的是当前的工作目录(work directory)。当查找路径有填写的时候,则表示的是在该目录底下进行文件查找。

TIP

工作目录就是使用pwd后,打印的目录。

表达式

find支持丰富的表达式,来表达式要在指定目录下查找指定特征的文件。

搜索层级

find中支持搜索层级的有两个选项,分别表示支持的最大和最小层级。

  • -maxdepth LEVEL, 表示最大的目录搜索深度,指定目录为第一级
  • -mindepth LEVEL,表示最小的目录搜索深度
根据文件名和inode查找
  • -name

Base of file name (the path with the leading directories removed) matches shell pattern pattern.

使用shell的pattern来匹配指定目录下的文件名称。因此可以使用Glob(通配符)。linux的通配符包括[]*,?

  • -iname

搜索文件,并且忽略大小写。

  • -num N

搜索inode号为N的文件。

  • -samefile name

搜索有相同inode号的文件。

  • -links n

搜索连接数为n的文件。

  • -regex PATTERN

使用正则表达式搜索。

按照文件所有者、所属组查找
  • -user USERNAME

根据文件的所有者来搜索

# 查看家目录中的文件
# 其中有三个文件的所有者和所有组都是root另外一个不是
]# ll
总用量 8
-rw-------. 1 root root  1300 6月  10 2020 anaconda-ks.cfg
-rw-r--r--. 1 root root    92 12月 21 14:49 dump.rdb
-rw-r--r--. 1 halt users    0 12月 25 09:23 f1_test.txt
drwxr-xr-x. 2 root root    62 12月 26 10:04 shell_scripts

# 查找当前目录下,搜索层级为1,文件所有者为root,不是隐藏的所有文件,打印到控制台
]# find . -maxdepth 1 -user root ! -name ".*" 
./anaconda-ks.cfg
./dump.rdb
./shell_scripts

  • -group GROUPNAME

根据文件的所属组来搜索。

  • -uid UID

根据文件的所属用户id来搜索。

  • -gid GroupID

根据文件的所属组id来搜索

  • -nouser

搜索没有属主的文件。

  • -nogroup

查找没有所属组的文件。

根据文件类型来搜索
  • -type FILE_TYPE

其中文件类型有如下几种:

  • f, 文件
  • d,目录
  • l,链接文件
  • s,socket文件
  • b,block块我呢间
  • c,字符设备
  • p,管道文件
搜索空文件或空目录
  • -empty
# 搜索/app下的空目录
]# find /app -type f -empty 

组合条件

如果在表达式中默认连续使用两个表达式,则默认表达的意思是与的关系,而find还能支持的关系。

  • -a, 与
  • -o, 或
  • -not, !, 非
根据文件大小查找
  • -size [+|-] N Unit

其中Unit表示文件大小的单位:

  • c, 表示字节(byte)
  • k, 表示千字节
  • M,兆字节
  • G, giga

其中数量词之前可以不加任何字符,可以加+, -分别表示:

  • +N Unit: (N,∞)
    • 如, +6k, 表示(6k,∞)
  • -N Unit: [0, N-1]
    • 如,-8M,表示[0,7M]
  • N Uniit: (N-1,N]
    • 如8M,表示 (7M,8M]
根据文件的时间查找

首先,在linux中文件的时间有三种,分别是:

  • atime: access tiime
  • ctime: change time
  • mtime: modify time

atime

atime是指上一次读取文件内容的时间。

ctime

ctime指的是文件的内容发生更改的上一次时间。

mtime

mtime是指文件的元数据,如所有者,所有组发生改变的时间。

那么如何看一个文件的上述时间呢?

# 使用ls -l 
# 当使用长格式查看文件的内容的时候,此时所展示的时间是mtime
]# ls -l
总用量 8
-rw-------. 1 root root  1300 6月  10 2020 anaconda-ks.cfg
-rw-r--r--. 1 root root    92 12月 21 14:49 dump.rdb
-rw-r--r--. 1 halt users    0 12月 25 09:23 f1_test.txt
drwxr-xr-x. 2 root root    62 12月 26 10:04 shell_scripts

# 可以使用ls -l --time=[atime|ctime|mtime]来展示所要查看的文件长格式
]# ls -l --time=atime
-rw-------. 1 root root  1300 6月  10 2020 anaconda-ks.cfg
-rw-r--r--. 1 root root    92 12月 21 14:49 dump.rdb
-rw-r--r--. 1 halt users    0 12月 27 13:27 f1_test.txt
drwxr-xr-x. 2 root root    62 12月 27 12:56 shell_scripts

也可以使用stat /path/to/filename来查看文件的属性信息。

]# stat f1_test.txt
 文件:"f1_test.txt"
  大小:0               块:0          IO 块:4096   普通空文件
设备:fd00h/64768d      Inode:68663144    硬链接:1
权限:(0644/-rw-r--r--)  Uid:(    7/    halt)   Gid:(  100/   users)
环境:unconfined_u:object_r:admin_home_t:s0
最近访问:2020-12-27 13:27:40.513385169 +0800
最近更改:2020-12-25 09:23:23.747333509 +0800
最近改动:2020-12-27 12:54:43.712425712 +0800
创建时间:-

关于文件时间的前置知识,到此介绍完毕。

-mtime,-ctime,-time后可跟的参数格式为: [+|-] N

N取5,则表示的意思是:

16090481435201.jpg
根据权限来查找

执行操作

如上所述,find是用来实时查找在指定目录下具有指定特征的文件,那么找到这些文件之后find还是可以支持对其进行操作的。 如进行打印、删除、复制、移动等。 而执行操作这一个步骤是可选的,默认是打印搜索到的文件。

  • -print

默认的处理操作,显示搜索的文件,打印至标准输出流。

  • ls

类似于对查找到的文件执行ls -l命令。

  • -fls /path/to/file

将查找到的文件以长格式保存到文件中。

  • -delete

删除查找到的文件。

  • -ok COMMAND {} ;

对查找到的每个文件使用COMMAND命令。 在命令执行之前都需要由用户确认是否执行。

  • -exec {} ;

和-ok类似,只是-exec不会再每个命令之心前和用户确认是否要执行。

你可能感兴趣的:(Linux文件查找)