Linux学习笔记——文件的查找与检索
文章目录
- 文件的查找
- 按照文件名搜索
- 按照文件大小进行搜索
- 按照修改时间搜索
- 按照权限搜索
- 按照所有者和所属组搜索
- 按照文件类型搜索
- 逻辑运算符
- 其他选项
- 文件的检索
- 在当前目录查找
- 递归查找
- 反向查找
文件的查找
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
-perm 权限模式
,这种搜索查找的权限必须和指定的权限模式一模一样,才可以找到:
[root@localhost test]#find . -perm 444
./test2
[root@localhost test]#find . -perm 200
./test4
#按照指定权限搜索文件,文件的权限必须和搜索指定的权限一致,才能找到
-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 权限,所以找不到,这也是完全包含的意义。
-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逻辑非。
下面分类进行说明:
- -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的文件
- -o:or逻辑或
-o
选项代表逻辑或运算,也就是 -o
的两个条件只要其中一个成立,find
命令就可以找到结果。例如:
[root@localhost ~]#find.-name cangls -o -name bols
./cangls
./bols
#在当前目录下搜索文件名要么是cangls的文件,要么是bols的文件
-o
选项的两个条件只要成立一个,find 命令就可以找到结果,所以这个命令既可以找到 cangls 文件,也可以找到 bols 文件。
- -not:not逻辑非
-not是逻辑非,也就是取反的意思。举个例子:
[root@localhost ~]# find.-not -name cangls
#在当前目录下搜索文件名不是cangls的文件
其他选项
- -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
命令更加方便。
- -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学习笔记——文件的查找与检索相关推荐
- Linux学习笔记-文件权限与路径
Linux学习笔记-文件与目录 目前从电子信息科学与技术转到了计算机专业,因此想趁着大四比较闲的时候补一些计算机的知识.我想说:你好,生活[斜眼笑]!愿生活温柔以待!哈哈,这是我写的第一篇博客,谨以此 ...
- Linux学习笔记 文件服务Vsftp详细介绍
Linux学习笔记 文件服务Vsftp详细介绍 知识点: 1.FTP使用TCP连接和TCP端口 2.在进行通信时,FTP需要建立两个TCP连接: 一个用于控制信息,TCP端口号缺省为21 一个用于数据 ...
- Linux学习笔记-文件压缩与解压缩
背景:文件压缩技术 首先,我们的电脑都是以字节为单位进行计量(最小计量单位为bit).假设我们要存储数字"1",那么计算机会存储为"00000001",压缩就是 ...
- Linux学习笔记——文件IO
文章目录 前言 C语言操作文件的函数 系统接口 文件描述符 文件系统 动态库和静态库 前言 在系统角度理解文件:文件=内容+属性,内容和属性都是数据,对于文件的所有操作无外乎对于文件内容操作和对于 ...
- Linux 学习笔记 文件、目录操作与用户群组权限
一.命令行提示符 1.1 命令行基础 bearpi:当前用户名,在@前是用户名 ubuntu:用户所在的域名,在@后面,这是我自定义的,默认应该是主机名 ~ 波浪线为目前所在目录,~代表家目录(hom ...
- Linux学习笔记07_搜索查找类和管道符
1. 查找文件或目录(find) find [搜索范围] [选项] <根据选项决定> :从指定目录向下递归地遍历其各个子目录,将满足条件的文件或目录显示在终端 常见选项 -name :按文 ...
- Linux学习笔记--文件夹结构
暂时先上一张图学习吧,先大致了解好,再进行深入的学习. 转载于:https://www.cnblogs.com/zzu-han/p/3256307.html
- Linux学习笔记 文件读写小细节
open 函数的flag int open(const *pathname, int falg, int parm) O_RDONLY //文件只读O_WRONLY //文件只写O_CREAT //不 ...
- linux rcs文件中的ip,linux学习笔记之diff和patch命令
关键字:Linux 学习笔记 运维 系统 命令 一.命令的功能 diff命令的功能为逐行比较两个文本文件,列出其不同之处.可是做成diff记录也就是补丁. patch就是利用diff制作的补丁来打到文 ...
最新文章
- oracle参数文件initorcl位置,ORACLE参数文件
- Centos7 上安装Docker
- 《天天数学》连载33:二月二日
- python 操作excel表格
- LSTM 手动实现车牌识别 Pytorch代码
- 网络计算机和弱电,弱电工程师和网络工程师的区别,你知道吗?
- 一文搞懂经济数据中M0 M1 M2
- 关于二分查找那些事儿~~~~看完至少节省你两个半月的时间!!!!!
- 矩阵分析L3内积空间
- html中css如何设置显示国旗,CSS3 各国国旗
- java excel进度条_导出excel 用easyui显示进度条(也适用于其他框架遮罩层,进度条)...
- android usb麦克风阵列,语音设备 SDK 麦克风阵列建议
- 第五篇 USB设备枚举过程(1)
- 2022年天干地支对照表,java实现
- [转]写给所有的IT民工们
- 小米无线显示没有设备连接到服务器,小米盒子连不上网在进入无线网络时居然搜索不到...
- STM32学习笔记 —— STM32CubeIDE安装与配置
- android rc文件
- [JavaScript 随笔] 一个 JS 框架需要做什么
- 织梦 详情页 php,织梦dedecms内页、详情页中调用文章发布者信息的方法
热门文章
- dynamic time warping matlab,Dynamic Time Warping
- Android studio连接MySQL并完成简单的登录注册功能
- DM数据库网络通信异常排查
- LabVIEW编程LabVIEW开发 ADAM-4056 DO模块例程与相关资料
- 【Spring】源码编译
- Android studio 百度地图开发(3)地图导航
- 联想小新Air15 2019 屏幕开胶问题解决记录及吐槽
- 怎么开网店——扬帆跨境
- 从零开始的移动构造函数,拷贝构造函数详解(C++)
- python实现ftp到ftp文件摆渡_双网隔离后 超大文件要如何快速的进行文件摆渡?...