第十五部分(查找文件)
2020-04-10
locate - 查找文件的简单方法
locate
程序会执行一次快速的路径名数据库搜索,并且输出每个与给定子字符串相匹配的路径名。
例如,我们想要找到所有名字以“zip
”开头的程序。因为我们正在查找程序,可以假定包含程序的目录以 “bin/
” 结尾。因此,我们试着以这种方式使用 locate
命令,来找到我们的文件:
[root@VM_0_7_centos dev]# locate bin/zip
/usr/bin/zip
/usr/bin/zipcloak
/usr/bin/zipgrep
/usr/bin/zipinfo
/usr/bin/zipnote
/usr/bin/zipsplit
/var/lib/docker/overlay2/d028963bd1d73b62e83e688e5f1a276954190b81c513f23c0faef73cbb1009a3/diff/usr/bin/zipdetails
locate
命令将会搜索它的路径名数据库,输出任一个包含字串“bin/zip
”的路径名。
如果搜索要求没有这么简单,locate
可以结合其它工具,比如说 grep
命令,来设计更加有趣的搜索:
[root@VM_0_7_centos dev]# locate zip | grep bin
/usr/bin/bunzip2
/usr/bin/bzip2
/usr/bin/bzip2recover
/usr/bin/funzip
/usr/bin/gpg-zip
/usr/bin/gunzip
/usr/bin/gzip
/usr/bin/unzip
/usr/bin/unzipsfx
/usr/bin/zip
/usr/bin/zipcloak
/usr/bin/zipgrep
/usr/bin/zipinfo
/usr/bin/zipnote
/usr/bin/zipsplit
/usr/lib/firmware/qed/qed_init_values_zipped-8.10.10.0.bin
/usr/lib/firmware/qed/qed_init_values_zipped-8.10.5.0.bin
...
locate
数据库来自何方?
你可能注意到了,在一些发行版中,仅仅在系统安装之后,locate
不能工作,但是如果你第二天再试一下,它就正常工作了。怎么回事呢?locate
数据库由另一个叫做updatedb
的程序创建。通常,这个程序作为一个定时任务(jobs
)周期性运转;也就是说,一个任务在特定的时间间隔内被cron
守护进程执行。大多数装有locate
的系统会每隔一天运行一回updatedb
程序。因为数据库不能被持续地更新,所以当使用locate
时,你会发现目前最新的文件不会出现。为了克服这个问题,通过更改为超级用户身份,在提示符下运行updatedb
命令,可以手动运行updatedb
程
序。
find - 查找文件的复杂方式
locate
程序只能依据文件名来查找文件,而 find
程序能基于各种各样的属性搜索一个给定目录(以及它的子目录),来查找文件。
在它的最简单的使用方式中,find
命令接收一个或多个目录名来执行搜索。例如,输出我们的家目录的路径名列表(包括文件及目录)。
[me@linuxbox ~]$ find ~
在最活跃的用户帐号中,这将产生一张很大的列表。因为这张列表被发送到标准输出,我们可以把这个列表管道到其它的程序中。让我们使用 wc
程序来计算出文件的数量:
[me@linuxbox ~]$ find ~ | wc -l
47068
Tests
比如说我们想在我们的搜索中得到目录列表。我们可以添加以下测试条件:
[me@linuxbox ~]$ find ~ -type d | wc -l
1695
添加测试条件-type d
限制了只搜索目录。相反地,我们可以使用这个测试条件来限定搜索普通文件:
[me@linuxbox ~]$ find ~ -type f | wc -l
38737
这里是 find
命令支持的常见文件类型测试条件:
我们也可以通过加入一些额外的测试条件,根据文件大小和文件名来搜索:让我们查找所有文件名匹配通配符模式“*.JPG”和文件大小大于 1M 的普通文件:
[me@linuxbox ~]$ find ~ -type f -name "*.JPG" -size +1M | wc -l
840
在这个例子里面,我们加入了 -name
测试条件,后面跟通配符模式。注意,我们把它用双引号引起来,从而阻止 shell 展开路径名。紧接着,我们加入 -size
测试条件,后跟字符串“+1M”。开头的加号表明我们正在寻找文件大小大于指定数的文件。若字符串以减号开头,则意味着查找小于指定数的文件。若没有符号意味着“精确匹配这个数”。结尾字母“M”表明测量单位是兆字节。下面的字符可以被用来指定测量单位:
find
命令支持大量不同的测试条件。下表是列出了一些常见的测试条件。请注意,在需要数值参数的情况下,可以应用以上讨论的“+
”和“-
”符号表示法:
操作符
即使拥有了 find
命令提供的所有测试条件,我们还需要一个更好的方式来描述测试条件之间的逻辑关系。例如,如果我们需要确定是否一个目录中的所有的文件和子目录拥有安全权限,怎么办呢?我们可以查找权限不是 0600
的文件和权限不是 0700
的目录。幸运地是,find
命令提供了一种方法来结合测试条件,通过使用逻辑操作符来创建更复杂的逻辑关系。为了表达上述的测试条件,我们可以这样做:
[me@linuxbox ~]$ find ~ \( -type f -not -perm 0600 \) -or \( -type d -not -perm 0700 \)
因为圆括号对于 shell 有特殊含义,我们必须转义它们,来阻止 shell 解释它们。在圆括号字符之前加上一个反斜杠字符来转义它们。
逻辑操作符还有另外一个特性要重点理解。比方说我们有两个由逻辑操作符分开的表达式:
expr1 -operator expr2
在所有情况下,总会执行表达式 expr1
;然而操作符将决定是否执行表达式 expr2
。这里列出了它是怎样工作的:
为什么这会发生呢?这样做是为了提高性能。以 -and
为例,我们知道如果表达式 expr1
的结果为假,表达式 expr1 -and expr2
不能为真,所以没有必要执行 expr2
。同样地,如果我们有表达式 expr1 -or expr2
,并且表达式 expr1
的结果为真,那么就没有必要执行 expr2
,因为我们已经知道表达式 expr1 -or expr2
为真。好,这样会执行快一些。为什么这个很重要?它很重要是因为我们能依靠这种行为来控制怎样来执行操作。
预定义的操作
执行 find
命令得到结果列表很有用处,但是我们真正想要做的事情是操作列表中的某些条目。幸运地是,find
命令允许基于搜索结果来执行操作。有许多预定义的操作和几种方式来应用用户定义的操作。首先,让我们看一下几个预定义的操作:
用户定义的行为
除了预定义的行为之外,我们也可以调用任意的命令。传统方式是通过 -exec
行为。这个行为像这样工作:
-exec command {} ;
这里的 command
就是指一个命令的名字,{}
是当前路径名的符号表示,分号是必要的分隔符表明命令的结束。
这里是一个使用 -exec
行为的例子,其作用如之前讨论的 -delete
行为:
-exec rm '{}' ';'
因为花括号和分号对于 shell 有特殊含义,所以它们必须被引起来或被转义。
我们也可以交互式地执行一个用户定义的行为。通过使用 -ok
行为来代替 -exec
,在执行每个指定的命令之前,会提示用户:
find ~ -type f -name 'foo*' -ok ls -l '{}' ';'
< ls ... /home/me/bin/foo > ? y
-rwxr-xr-x 1 me me 224 2007-10-29 18:44 /home/me/bin/foo
< ls ... /home/me/foo.txt > ? y
-rw-r--r-- 1 me me 0 2008-09-19 12:53 /home/me/foo.txt
在这个例子里面,我们搜索以字符串“foo”开头的文件名,并且对每个匹配的文件执行 ls -l
命令。使用 -ok
行为,会在 ls
命令执行之前提示用户。
提高效率
当 -exec
行为被使用的时候,若每次找到一个匹配的文件,它会启动一个新的指定命令的实例。
我们可能更愿意把所有的搜索结果结合起来,再运行一个命令的实例。例如,与其像这样执行命令:
ls -l file1
ls -l file2
我们更喜欢这样执行命令:
ls -l file1 file2
这样就导致命令只被执行一次而不是多次。有两种方法可以这样做。传统方式是使用外命令 xargs
,另一种方法是,使用 find
命令自己的一个新功能。我们先讨论第二种方法。
通过把末尾的分号改为加号,就激活了 find
命令的一个功能,把搜索结果结合为一个参数列表,然后用于所期望的命令的一次执行。再看一下之前的例子,这个例子中:
find ~ -type f -name 'foo*' -exec ls -l '{}' ';'
-rwxr-xr-x 1 me me 224 2007-10-29 18:44 /home/me/bin/foo
-rw-r--r-- 1 me me 0 2008-09-19 12:53 /home/me/foo.txt
每次找到一个匹配的文件,就会执行一次 ls
命令。通过把命令改为:
find ~ -type f -name 'foo*' -exec ls -l '{}' +
-rwxr-xr-x 1 me me 224 2007-10-29 18:44 /home/me/bin/foo
-rw-r--r-- 1 me me 0 2008-09-19 12:53 /home/me/foo.txt
虽然我们得到一样的结果,但是系统只需要执行一次 ls
命令。
xargs
这个 xargs
命令会执行一个有趣的函数。它从标准输入接受输入,并把输入转换为一个特定命令的参数列表。对于我们的例子,我们可以这样使用它:
find ~ -type f -name 'foo*' -print | xargs ls -l
-rwxr-xr-x 1 me me 224 2007-10-29 18:44 /home/me/bin/foo
-rw-r--r-- 1 me me 0 2008-09-19 12:53 /home/me/foo.txt
这里我们看到 find
命令的输出被管道到 xargs
命令,之后,xargs
会为 ls
命令构建参数列表,然后执行 ls
命令。
选项
最后,我们有这些选项。这些选项被用来控制 find
命令的搜索范围。当构建 find
表达式的时候,它们可能被其它的测试条件和行为包含,这里有一个最常被使用的选项的列表:
第十五部分(查找文件)相关推荐
- Unity3D学习笔记(二十五):文件操作
文件是什么? 存储在硬盘上的最后的节点. 文件夹是什么? 文件的上级单位称为文件夹. 文件夹的基本结构? 文件夹是层级化结构的,对于同级的文件夹不可以重名,父文件夹和子文件夹可以同名> IO:I ...
- 第二十五课:文件的读写
一.文件的打开与关闭 在python中,使用open函数,打开一个已经存在的文件,或者新建一个新文件. 函数语法 open(name[, mode[, buffering[,encoding]]]) ...
- C语言学习第十五课(文件操作)
第十五课 1,文件的概念 文件一般指存储在外部介质(如磁盘磁带)上的集合: 2,流的概念 ·操作系统是以文件为单位对数据进行管理的,输入输出是数据传送的过程,数据如流水一般从一处流向另一处,因此将输入 ...
- 25 linux ndk 头文件_正点原子Linux第二十五章RTC实时时钟实验
1)资料下载:点击资料即可下载 2)对正点原子Linux感兴趣的同学可以加群讨论:935446741 3)关注正点原子公众号,获取最新资料更新 第二十五章RTC实时时钟实验 实时时钟是很常用的一个外设 ...
- Python编程基础:第三十五节 文件删除Delete a File
第三十五节 文件删除Delete a File 前言 实践 前言 我们这一节来介绍如何删除一个文件,这里需要用到函数os.remove(path)用于删除指定路径下的文件,os.rmdir(path) ...
- 鸟哥的Linux私房菜(基础篇)- 第十五章、磁碟配额(Quota)与进阶文件系统管理
第十五章.磁碟配额(Quota)与进阶文件系统管理 最近升级日期:2009/09/10 如果您的 Linux 服务器有多个用户经常存取数据时,为了维护所有使用者在硬盘容量的公平使用,磁碟配额 (Quo ...
- linux键盘设置的文件在哪个文件夹,「正点原子Linux连载」第十五章按键输入试验...
原标题:「正点原子Linux连载」第十五章按键输入试验 第十五章按键输入试验 前面几章试验都是讲解如何使用I.MX6U的GPIO输出控制功能,I.MX6U的IO不仅能作为输出,而且也可以作为输入.I. ...
- python复制指定字符串_python3.4学习笔记(十五) 字符串操作(string替换、删除、截取、复制、连接、比较、查找、包含、大小写转换、分割等)...
python3.4学习笔记(十五) 字符串操作(string替换.删除.截取.复制.连接.比较.查找.包含.大小写转换.分割等) python print 不换行(在后面加上,end=''),prin ...
- 【SQL开发实战技巧】系列(十五):查找最值所在行数据信息及快速计算总和百之max/min() keep() over()、fisrt_value、last_value、ratio_to_report
系列文章目录 [SQL开发实战技巧]系列(一):关于SQL不得不说的那些事 [SQL开发实战技巧]系列(二):简单单表查询 [SQL开发实战技巧]系列(三):SQL排序的那些事 [SQL开发实战技巧] ...
最新文章
- 【机器学习入门】(8) 线性回归算法:正则化、岭回归、实例应用(房价预测)附python完整代码和数据集
- linux halt函数,常用Linux命令 reboot halt shutdown passwd vlock exit等
- lru页面置换算法_C|内存管理|从LRU王国到NRU王国
- left join on多表关联_资深DBA整理MySQL基础知识三:迅速理解MySQL的关联和子查询...
- php生成pdf中文断码_Rmarkdown导出中文PDF解决方案
- 论文及文献资料的搜集好去处---子午学术论坛
- 基于游戏开发的C语言大作业视频集锦
- 编程语言和shell编程的基础内容以及grep、egrep命令及相应的正则表达式和用法...
- IOS设计模式第二篇之单例设计模式
- iBase4J项目笔记
- 【C++】万年历程序
- WinRar去除广告弹窗
- 从零开始搭建自己的个人博客网站
- 显卡组超级计算机,NVIDIA发布全新显卡 在家就能拥有超级计算机
- java 检测表情符号_检测字符串中的字符是否为表情符号(使用Android)
- 物联网组网技术比较 NB-IoT、LoRa、ZigBee、WiFi、蓝牙等
- Vue3.0 + Echarts 实现地区人口数量分布展示
- TFN高性能无线电综合测试仪让测试更加精准
- 笑话类网站推广的几种很实用的方法
- 使用steamcommunity302加速github访问
热门文章
- bada开发基础之内存管理
- 微信公众号如何实现视频列表播放视频的功能
- 数据可视化干货:使用pandas和seaborn制作炫酷图表(附代码)
- 计算机与打印机脱机后怎么共享,打印机脱机怎么办,网络打印机脱机,共享打印机脱机-中关村在线...
- n1装哪个版本的linux,Linux中安装使用Nylas N1邮件客户端
- 嵌入式操作系统µCOS-II及应用编程
- 请教如何在Win7 x64环境下安装WDK7.1??
- 【BFS】献给阿尔吉侬的花束(C++)
- 官宣!长城汽车正式收购戴姆勒巴西工厂;安进任命许蔼龄为安进中国总经理 | 美通社头条...
- Android10报错:error: format specifies type ‘long long‘ but the argument has type ‘int64_t‘ (aka ‘long‘