文章目录

  • 文件的查找
    • 按照文件名搜索
    • 按照文件大小进行搜索
    • 按照修改时间搜索
    • 按照权限搜索
    • 按照所有者和所属组搜索
    • 按照文件类型搜索
    • 逻辑运算符
    • 其他选项
  • 文件的检索
    • 在当前目录查找
    • 递归查找
    • 反向查找

文件的查找

Linux的文件查找命令使用 find,其命令格式如下:

find 搜索路径 [选项] 搜索内容

find 命令有三·个参数:

  • 第一个参数用来指定搜索路径;
  • 第二个参数用来指定按什么进行搜索,比如按文件名或者按文件大小等;
  • 第二个参数用来指定搜索内容。

下面我们分类进行说明。


按照文件名搜索

选项:

  • -name:按文件名搜索;
  • -iname:按文件名搜索,不区分文件名大小;
  • -inum:按照 inode 号搜索。

比如我们要搜索家目录下,文件名为 hello.c 的文件:


当然也可以使用通配符:


按照文件大小进行搜索

选项:

  • -size [+/-] 大小 [b/c/w/k/M/G]

这里的 + 表示搜索大于该大小的文件,而 - 就表示小于该大小的文件。而后面可选的单位有如下几种选项:

'b' for 512-byte blocks (this is the default if no suffix is used)
#这是默认单位,如果单位为b或不写单位,则按照 512Byte搜索
'c' for bytes
#搜索单位是c,按照字节搜索
'w' for two-byte words
#搜索单位是w,按照双字节(中文)搜索
'k'for Kilobytes (units of 1024 bytes)
#按照KB单位搜索,必须是小写的k
'M' for Megabytes (units of 1048576 bytes)
#按照MB单位搜索,必须是大写的M
'G' for Gigabytes (units of 1073741824 bytes)
#按照GB单位搜索,必须是大写的G

如果我们想搜索大于 10KB 的文件,可以使用如下指令:

当然我们也可以搜索一个区间里的文件,比如[10M, 100M]:


按照修改时间搜索

Linux 中的文件有访问时间(atime)、数据修改时间(mtime)、状态修改时间(ctime)这三个时间,我们也可以按照时间来搜索文件。

选项:

  • atime [+-]时间:按照文件访问时间搜索;

  • mtime [+-]时间:按照文件数据修改时间搜索;

  • ctime [+-]时间:按照文件状态修改时间搜索。

  • -5:代表5天内修改的文件;

  • 5:代表前5~6天那一天修改的文件;

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

下面用一个时间轴解释一下:

按照权限搜索

选项:

  • -perm 权限模式:查找文件权限刚好等于权限模式的文件;
  • -perm -权限模式: 查找文件权限全部包含权限模式的文件;
  • -perm +权限模式:查找文件权限包含权限模式的任意一个权限的文件。

为了便于理解,我们要举几个例子。先建立几个测试文件:

[root@localhost ~]# mkdir test
[root@localhost ~]# cd test/
[root@localhost test]# touch testl
[root@localhost test]# touch test2
[root@localhost test]# touch test3
[root@localhost test]# touch test4
#建立测试目录,以及测试文件
[root@localhost test]# chmod 755 testl
[root@localhost test]# chmod 444 test2
[root@localhost test]# chmod 600 test3
[root@localhost test]# chmod 200 test4
  1. -perm 权限模式,这种搜索查找的权限必须和指定的权限模式一模一样,才可以找到:
[root@localhost test]#find . -perm 444
./test2
[root@localhost test]#find . -perm 200
./test4
#按照指定权限搜索文件,文件的权限必须和搜索指定的权限一致,才能找到
  1. -perm -权限模式,代表文件的权限必须全部包含搜索命令指定的权限模式,才可以找到:
[root@localhost test]#find . -perm -200
./test4 <-此文件权限为200
./test3 <-此文件权限为600
./testl <-此文件权限为755
#搜索文件的权限包含200的文件,不会找到test2文件,因为test2的权限为444,不包含200权限

因为 test4 的权限 200(-w-------)、test3 的权限 600(-rw-------)和 test1 的权限 755(-rwxr-xr-x) 都包含 200(–w-------) 权限,所以可以找到;而 test2 的权限是 444 (-r–r–r–),不包含 200 (–w-------)权限,所以找不到,再试试:

[root@localhost test]# find .-perm -444
.
./test2 <-此文件权限为444
./test1 <-此文件权限为755
#搜索文件的权限包含444的文件

上述搜索会找到 test1 和 test2,因为 test1 的权限 755 (-rwxr-xr-x)和 test2 的权限 444 (-r–r–r–)都完全包含 444 (-r–r–r–)权限,所以可以找到;而 test3 的权限 600 (-rw-------)和 test4 的权限 200 (-w-------)不完全包含 444 (-r–r–r–) 权限,所以找不到。也就是说,test3 和 test4 文件的所有者权限虽然包含 4 权限,但是所属组权限和其他人权限都是 0,不包含 4 权限,所以找不到,这也是完全包含的意义。

  1. -perm +权限模式,只要包含任意一个指定权限,就可以找到:
[root@localhost test]# find . -perm +444
./test4 <-此文件权限为200
./test3 <-此文件权限为600
./testl <-此文件权限为755
#搜索文件的权限包含200的文件,不会找到test2文件,因为test2的权限为444,不包含200权限。

因为 test4 的权限 200 (–w-------)、test3 的权限 600 (-rw-------)和 test1 的权限 755 (-rwxr-xr-x)都包含 200(–w-------)权限,所以可以找到;而 test2 的权限是 444 (-r–r–r–),不包含 200 (–w-------)权限,所以找不到。


按照所有者和所属组搜索

选项:

  • -uid 用户 ID:按照用户 ID 査找所有者是指定 ID 的文件;
  • -gid 组 ID::按照用户组 ID 査找所属组是指定 ID 的文件;
  • -user 用户名:按照用户名査找所有者是指定用户的文件;
  • -group 组名:按照组名査找所属组是指定用户组的文件;
  • nouser:査找没有所有者的文件。

这组选项比较简单,就是按照文件的所有者和所属组来进行文件的査找。在 Linux 系统中,绝大多数文件都是使用 root 用户身份建立的,所以在默认情况下,绝大多数系统文件的所有者都是 root。例如:

[root@localhost ~]#find . -user root
#在当前目录中査找所有者是 root 的文件

由于当前目录是 root 的家目录,所有文件的所有者都是 root 用户,所以这条搜索命令会找到当前目录下所有的文件。

按照所有者和所属组搜索时,-nouser 选项比较常用,主要用于査找垃圾文件。在 Linux 中,所有的文件都有所有者,只有一种情况例外,那就是外来文件。比如光盘和 U 盘中的文件如果是由 Windows 复制的,在 Linux 中査看就是没有所有者的文件;再比如手工源码包安装的文件,也有可能没有所有者。

除这种外来文件外,如果系统中发现了没有所有者的文件,一般是没有作用的垃圾文件(比如用户删除之后遗留的文件),这时需要用户手工处理。搜索没有所有者的文件,可以执行以下命令:

[root@localhost ~]# find/-nouser

按照文件类型搜索

选项:-type 文件类型,Linux 有如下文件类型:

比如搜索家目录下的管道文件:


逻辑运算符

选项:

  • -a:and逻辑与;
  • -o:or逻辑或;
  • -not:not逻辑非。

下面分类进行说明:

  1. -a:and逻辑与

find 命令也支持逻辑运算符选项,其中 -a 代表逻辑与运算,也就是 -a 的两个条件都成立,find 搜索的结果才成立。

举个例子:

[root@localhost ~]# find.-size +2k -a -type f
#在当前目录下搜索大于2KB,并且文件类型是普通文件的文件在这个例子中,文件既要大于 2KB,又必须是普通文件,find 命令才可以找到。再举个例子:
[root@localhost ~]# find.-mtime -3 -a -perm 644
#在当前目录下搜索3天以内修改过,并且权限是644的文件
  1. -o:or逻辑或

-o 选项代表逻辑或运算,也就是 -o 的两个条件只要其中一个成立,find 命令就可以找到结果。例如:

[root@localhost ~]#find.-name cangls -o -name bols
./cangls
./bols
#在当前目录下搜索文件名要么是cangls的文件,要么是bols的文件

-o 选项的两个条件只要成立一个,find 命令就可以找到结果,所以这个命令既可以找到 cangls 文件,也可以找到 bols 文件。

  1. -not:not逻辑非

-not是逻辑非,也就是取反的意思。举个例子:

[root@localhost ~]# find.-not -name cangls
#在当前目录下搜索文件名不是cangls的文件

其他选项

  1. -exec选项

这里我们主要讲解两个选项 -exec-ok,这两个选项的基本作用非常相似。我们先来看看 exec 选项的格式。

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

首先,请大家注意这里的 {}\; 是标准格式,只要执行 -exec 选项,这两个符号必须完整输入。

其次,这个选项的作用其实是把 find 命令的结果交给由 -exec 调用的 命令 2 来处理。{} 就代表 find 命令的査找结果。

我们举个例子,刚刚在讲权限的时候,使用权限模式搜索只能看到文件名,例如:

[root@localhost test]#find.-perm 444
./test2

如果要看文件的具体权限,还要用 ll 命令査看。用 -exec 选项则可以一条命令搞定:

[root@localhost test]# find.-perm 444 -exec ls -l {}\;
-r--r--r-- 1 root root 0 6月 17 11:05 ./test2
#使用"-exec"选项,把find命令的结果直接交给"ls -l"命令处理

-exec 选项的作用是把 find 命令的结果放入{} 中,再由命令 2 直接处理。在这个例子中就是用 ls -l 命令直接处理,会使 find 命令更加方便。

  1. -ok 选项
    -ok 选项和 -exec 选项的作用基本一致,区别在 -exec 的命令会直接处理,而不询问;-ok 的命令 2 在处理前会先询问用户是否这样处理,在得到确认命令后,才会执行。例如:
[root@localhost test]# find .-perm 444 -ok rm -rf{}\;
<rm…./test2>?y  <-需要用户输入y,才会执行
#我们这次使用rm命令来删除find找到的结果,删除的动作最好确认一下

文件的检索

Linux中文件的检索主要使用 grep 命令,其用于查找内容包含指定的范本样式的文件,如果发现某文件的内容符合所指定的范本样式,预设 grep 指令会把含有范本样式的那一列显示出来。如不指定任何文件名称,或是所给予的文件名为 -,则 grep 指令会从标准输入设备读取数据。

其语法如下:

grep [-abcEFGhHilLnqrsvVwxy][-A<显示行数>][-B<显示列数>][-C<显示列数>][-d<进行动作>][-e<范本样式>][-f<范本文件>][--help][范本样式][文件或目录...]

下面主要针对几个常用的进行说明:

在当前目录查找

在当前目录中,查找后缀有 file 字样的文件中包含 test 字符串的文件,并打印出该字符串的行。此时,可以使用如下命令:

grep “test” *file

结果如下所示:

$ grep “test” test* #查找前缀有“test”的文件包含“test”字符串的文件
testfile1:This a Linux testfile! #列出testfile1 文件中包含test字符的行
testfile_2:This is a linux testfile! #列出testfile_2 文件中包含test字符的行
testfile_2:Linux test #列出testfile_2 文件中包含test字符的行

递归查找

前面不带任何选项是不会对子目录进行查找的,通过选项 -r 来对子目录递归查找:

grep -r “update” /etc/acpi

输出结果如下:

$ grep -r “update” /etc/acpi #以递归的方式查找“etc/acpi”
#下包含“update”的文件
/etc/acpi/ac.d/85-anacron.sh:# (Things like the slocate updatedb cause a lot of IO.)
Rather than
/etc/acpi/resume.d/85-anacron.sh:# (Things like the slocate updatedb cause a lot of
IO.) Rather than
/etc/acpi/events/thinkpad-cmos:action=/usr/sbin/thinkpad-keys--update

反向查找

前面的例子是查找并打印符合条件的行,通过 -v 参数可以打印不符合条件行的内容。

比如查找文件名包含 test 的文件中不包含 test 的行,使用的命令为:

grep -v "test" *test*

结果如下所示:

$ grep -v "test" *test* #查找文件名中包含test 的文件中不包含test的行
testfile1:helLinux!
testfile1:Linis a free Unix-type operating system.
testfile1:Lin
testfile_1:HELLO LINUX!
testfile_1:LINUX IS A FREE UNIX-TYPE OPTERATING SYSTEM.
testfile_1:THIS IS A LINUX TESTFILE!
testfile_2:HELLO LINUX!
testfile_2:Linux is a free unix-type opterating system.

Linux学习笔记——文件的查找与检索相关推荐

  1. Linux学习笔记-文件权限与路径

    Linux学习笔记-文件与目录 目前从电子信息科学与技术转到了计算机专业,因此想趁着大四比较闲的时候补一些计算机的知识.我想说:你好,生活[斜眼笑]!愿生活温柔以待!哈哈,这是我写的第一篇博客,谨以此 ...

  2. Linux学习笔记 文件服务Vsftp详细介绍

    Linux学习笔记 文件服务Vsftp详细介绍 知识点: 1.FTP使用TCP连接和TCP端口 2.在进行通信时,FTP需要建立两个TCP连接: 一个用于控制信息,TCP端口号缺省为21 一个用于数据 ...

  3. Linux学习笔记-文件压缩与解压缩

    背景:文件压缩技术 首先,我们的电脑都是以字节为单位进行计量(最小计量单位为bit).假设我们要存储数字"1",那么计算机会存储为"00000001",压缩就是 ...

  4. Linux学习笔记——文件IO

    文章目录 前言 C语言操作文件的函数 系统接口 文件描述符 文件系统 动态库和静态库 前言   在系统角度理解文件:文件=内容+属性,内容和属性都是数据,对于文件的所有操作无外乎对于文件内容操作和对于 ...

  5. Linux 学习笔记 文件、目录操作与用户群组权限

    一.命令行提示符 1.1 命令行基础 bearpi:当前用户名,在@前是用户名 ubuntu:用户所在的域名,在@后面,这是我自定义的,默认应该是主机名 ~ 波浪线为目前所在目录,~代表家目录(hom ...

  6. Linux学习笔记07_搜索查找类和管道符

    1. 查找文件或目录(find) find [搜索范围] [选项] <根据选项决定> :从指定目录向下递归地遍历其各个子目录,将满足条件的文件或目录显示在终端 常见选项 -name :按文 ...

  7. Linux学习笔记--文件夹结构

    暂时先上一张图学习吧,先大致了解好,再进行深入的学习. 转载于:https://www.cnblogs.com/zzu-han/p/3256307.html

  8. Linux学习笔记 文件读写小细节

    open 函数的flag int open(const *pathname, int falg, int parm) O_RDONLY //文件只读O_WRONLY //文件只写O_CREAT //不 ...

  9. linux rcs文件中的ip,linux学习笔记之diff和patch命令

    关键字:Linux 学习笔记 运维 系统 命令 一.命令的功能 diff命令的功能为逐行比较两个文本文件,列出其不同之处.可是做成diff记录也就是补丁. patch就是利用diff制作的补丁来打到文 ...

最新文章

  1. oracle参数文件initorcl位置,ORACLE参数文件
  2. Centos7 上安装Docker
  3. 《天天数学》连载33:二月二日
  4. python 操作excel表格
  5. LSTM 手动实现车牌识别 Pytorch代码
  6. 网络计算机和弱电,弱电工程师和网络工程师的区别,你知道吗?
  7. 一文搞懂经济数据中M0 M1 M2
  8. 关于二分查找那些事儿~~~~看完至少节省你两个半月的时间!!!!!
  9. 矩阵分析L3内积空间
  10. html中css如何设置显示国旗,CSS3 各国国旗
  11. java excel进度条_导出excel 用easyui显示进度条(也适用于其他框架遮罩层,进度条)...
  12. android usb麦克风阵列,语音设备 SDK 麦克风阵列建议
  13. 第五篇 USB设备枚举过程(1)
  14. 2022年天干地支对照表,java实现
  15. [转]写给所有的IT民工们
  16. 小米无线显示没有设备连接到服务器,小米盒子连不上网在进入无线网络时居然搜索不到...
  17. STM32学习笔记 —— STM32CubeIDE安装与配置
  18. android rc文件
  19. [JavaScript 随笔] 一个 JS 框架需要做什么
  20. 织梦 详情页 php,织梦dedecms内页、详情页中调用文章发布者信息的方法

热门文章

  1. dynamic time warping matlab,Dynamic Time Warping
  2. Android studio连接MySQL并完成简单的登录注册功能
  3. DM数据库网络通信异常排查
  4. LabVIEW编程LabVIEW开发 ADAM-4056 DO模块例程与相关资料
  5. 【Spring】源码编译
  6. Android studio 百度地图开发(3)地图导航
  7. 联想小新Air15 2019 屏幕开胶问题解决记录及吐槽
  8. 怎么开网店——扬帆跨境
  9. 从零开始的移动构造函数,拷贝构造函数详解(C++)
  10. python实现ftp到ftp文件摆渡_双网隔离后 超大文件要如何快速的进行文件摆渡?...