EduCoder Linux之文件/目录搜索
Posted Alex Hub
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了EduCoder Linux之文件/目录搜索相关的知识,希望对你有一定的参考价值。
本实训主要讲解Linux
中文件查找和定位方法。
Linux
系统中查找文件的方法不同于Windows
系统,在Windows
系统中查找文件的方法比较容易,只要在桌面上点击“开始”-“搜索”中就能按照各种方式进行查找,对于Linux
新手来讲,在Linux
系统中查找一个文件比较空难,它不像Windows
那样方便,在Linux
中通常使用命令来查找文件,常见查找文件的命令有locate
、which
、whereis
和find
等。
本实训主要讲解如何在Linux
系统中查找文件/目录。
第1关:查询命令-locate
任务描述
假设,我们想找一个月前创建的一个文件,但是又不记得具体是放在什么位置,只记得文件的名称,通过本关的学习,我们将可以轻松的完成对文件/目录的搜索。
本关任务:使用locate
命令查找系统中的文件。
相关知识
locate
locate
命令用来查找文件或目录。
locate
命令要比其他查找文件命令(例如:find
)快得多,原因在于它不搜索具体目录,而是搜索一个数据库/var/lib/mlocate/mlocate.db
。
/var/lib/mlocate/mlocate.db
这个数据库中含有本地所有文件信息。Linux 系统自动创建这个数据库,并且每天自动更新一次,因此,我们在用locate
查找文件时,有时会找到已经被删除的数据,或者刚刚建立文件,却无法查找到,原因就是因为数据库文件没有被更新。为了避免这种情况,可以在使用locate
之前,先使用updatedb
命令,手动更新数据库。
接下让我们详细的学习locate
和updatedb
的使用方法。
locate
具体命令如下:
locate 命令参数 文件/目录
常用命令参数如下:
-c, --count 只输出找到的数量;
-d, --database DBPATH 使用DBPATH指定的数据库,而不是默认数据库/var/lib/mlocate/mlocate.db;
-i, --ignore-case 忽略大小写;
-q, --quiet 安静模式,不会显示任何错误讯息;
-e, --existing 只显示当前存在的文件条目;
案例演示1
:
搜索etc
目录下以pass
开头的文件或目录,具体使用如下命令:
locate /etc/pass
案例演示2
:
搜索包含passwd
字母的文件或目录总个数,具体使用如下命令:
locate -c passwd
updatedb
updatedb
命令用来创建或更新locate
命令所必需的数据库文件。
updatedb
命令的执行过程较长,因为在执行时它会遍历整个系统的目录树,并将所有的文件信息写入locate
数据库文件中。
具体命令如下:
updatedb 命令参数
常用参数如下:
-o<文件>:忽略默认的数据库文件,使用指定的slocate数据库文件;
-U<目录>:更新指定目录的slocate数据库;
-v:显示执行的详细过程;
执行权限:updatedb
必须以root
权限才能执行,如果是普通用户想执行updatedb
时,需要在命令前加sudo
命令来提升权限为root
权限。
案例演示1
:
新创建一个testFile
文件,更新locate
数据库后使用locate
命令定位该文件,具体使用如下命令:
touch testFile
locate testFile
sudo updatedb
locate testFile
可以看到新创建文件后直接使用locate
去查找是没有任何结果的,只有更新数据库后才能查找到新创建的文件。
案例演示2
:
删除testFile
文件,更新locate
数据库后使用locate
命令定位该文件,具体使用如下命令:
rm testFile
locate testFile
sudo updatedb -U ./
locate testFile
第三条命令是只更新testFile
所在目录的数据库,这样速度比较快,如果不使用该参数,则会更新整个文件系统的内容。
可以看到删除文件后直接使用locate
去查找是可以定位到的,但是此时文件已经不存在了,原因是没有马上更新数据库。
编程要求
在右侧编辑器中补充代码,使用locate
命令查找系统中的文件,具体编程要求如下:
使用
locate
命令查找系统中所有包括group
字母的文件或目录的总个数;使用
locate
命令定位系统中最新创建的文件newFile
。
测试说明
平台会对你编写的代码进行评测:
预期输出:
定位group文件/目录个数成功
定位newFile文件成功
只有胜利才能生存,只有成功才有代价,只有耕耘才有收获。——佚名
开始你的任务吧,祝你成功!
#!/bin/bash
#在以下部分写出完成任务的命令
#*********begin*********#
locate -c group
updatedb
locate newFile
#********* end *********#
第2关:查询命令-which/whereis
任务描述
假设系统中存在两个同名的可执行文件gcc
时,我们在命令行下输入gcc
后,但是我们不知道具体执行的是那个gcc
,通过本关的学习,我们将会学习到如何定位一个命令的位置以及首选执行命令的位置。
本关任务:使用which
和whereis
命令查找系统中的文件。
相关知识
在第一关中我们讲解了locate
命令的使用方法以及其原理,本关将介绍 Linux 另外两个定位文件的命令,分别是which
和whereis
。
which
命令主要是用来查找系统PATH
目录下的可执行文件,说白了就是查找那些我们已经安装好的可以直接执行的命令。
whereis
命令可以用来查找二进制(命令)、源文件、man
文件。与which
不同的是这条命令可以是通过文件索引数据库而非PATH
来查找的,所以查找的面比which
要广。
接下让我们详细的学习which
和whereis
的使用方法。
which
which
命令用于查找并显示给定命令的绝对路径,环境变量PATH
中保存了查找命令时需要遍历的目录。which
指令会在环境变量$PATH
设置的目录里查找符合条件的文件。也就是说,使用which
命令,就可以看到某个系统命令是否存在,以及执行的到底是哪一个位置的命令。
which
是shell
内建命令,内建命令要比系统论命令有比较高的执行效率。
具体命令如下:
which 命令
案例演示:
使用which
命令定位passwd
命令的位置,具体使用如下命令:
which passwd
可以看到passwd
命令是存放在/usr/bin
目录下。
whereis
whereis
命令用来定位指令的二进制程序、源代码文件和man
手册页等相关文件的路径。
具体命令如下:
whereis 命令参数 文件名
常用命令参数如下:
-b:只查找二进制文件;
-B<目录>:只在设置的目录下查找二进制文件;
-m:只查找说明文件;
-M<目录>:只在设置的目录下查找说明文件;
-s:只查找原始代码文件;
-S<目录>只在设置的目录下查找原始代码文件;
案例演示1
:
使用whereis
命令查找passwd
命令所有信息,包括二进制文件位置、说明文件位置和源码文件位置,具体使用如下命令:
whereis passwd
案例演示2
:
使用whereis
命令仅查找passwd
命令二进制文件位置,具体使用如下命令:
whereis -b passwd
可以看到passwd
命令存在的位置有两处,分别是/usr/bin/passwd
和/usr/bin/X11/passwd
,那么在我们执行passwd
时,如何确定是执行的哪一个,此时我们就可以使用which
命令来定位首先被执行的命令位置。
编程要求
在右侧编辑器中补充代码,使用which
和whereis
命令定位命令位置,具体编程要求如下:
使用
which
命令定位useradd
命令的位置;使用
whereis
命令查询useradd
命令的所有信息,包括二进制文件位置、说明文件位置和源码文件位置;使用
whereis
命令仅查找useradd
命令说明文件位置。
测试说明
平台将对编写的代码进程评测:
预期输出:
定位useradd命令的位置成功
定位useradd命令的所有信息位置成功
定位useradd命令的说明文件位置成功
成功的唯一秘诀——坚持最后一分钟。——柏拉图
开始你的任务吧,祝你成功!
#!/bin/bash
#在以下部分写出完成任务的命令
#***********begin*************#
which useradd
whereis useradd
whereis -m useradd
#************end**************#
第3关:查询命令-find
任务描述
通过前两关的学习,我们学会了如何定位一个文件/目录,但是Linux
系统还提供了一个搜索文件/目录的命令,这个命令就是-find
,find
命令是每个学习Linux
的用户都会遇到的,通过本关的学习,我们将会掌握find
命令的常用用法以及高级用法。
本关任务:使用find
命令查找系统中的文件/目录。
相关知识
通过以上两关的学习,我们已经学会了使用locate
命令查询系统中的文件/目录,使用which
和whereis
命令来定位可执行文件的位置。接下来让我们一起学习查询文件/目录的最后一个命令-find
。
find
命令与locate
命令相比各有各的优缺点,locate
命令的优点就是查找速度比find
命令快的多,但是缺点也比较明显,locate
命令无法查找最新添加的文件/目录以及会查找出来已经过期的文件/目录。
相反find
命令的优点就是可以按照自定义的方法查找任何文件,缺点就是查询速度比较慢,因为是通过遍历硬盘来查找而不像locate
命令事先建立好数据库来进行查找。
接下让我们详细的学习find
的使用方法。
find
find
命令用来在指定目录下查找文件。任何位于参数之前的字符串都将被视为欲查找的目录名。如果使用该命令时,不设置任何参数,则find
命令将在当前目录下查找子目录与文件。并且将查找到的子目录和文件全部进行显示。
具体命令如下:
find 查找目录 查找参数 查找内容
常用查找参数如下:
-amin<+|-分钟>:查找在指定时间曾被存取过的文件或目录,单位以分钟计算;
-atime<+|-24小时数>:查找在指定时间曾被存取过的文件或目录,单位以24小时计算;
-cmin<+|-分钟>:查找在指定时间之时被更改过的文件或目录;
-ctime<+|-24小时数>:查找在指定时间之时被更改的文件或目录,单位以24小时计算;
-mmin<+|-分钟>:查找在指定时间曾被更改过的文件或目录,单位以分钟计算;
-mtime<+|-24小时数>:查找在指定时间曾被更改过的文件或目录,单位以24小时计算;
-depth:从指定目录下最深层的子目录开始查找;
-exec<执行指令>:假设find指令的回传值为True,就执行该指令;
-follow:排除符号连接;
-gid<群组识别码>:查找符合指定群组识别码的文件或目录;
-group<群组名称>:查找符合指定群组名称的文件或目录;
-uid<用户识别码>:查找符合指定的用户识别码的文件或目录;
-user<拥有者名称>:查找符和指定的拥有者名称的文件或目录;
-name<范本样式>:指定字符串作为寻找文件或目录的范本样式;
-iname<范本样式>:此参数的效果和指定“-name”参数类似,但忽略字符大小写的差别;
-inum<inode编号>:查找符合指定的inode编号的文件或目录;
-newer<参考文件或目录>:查找其更改时间较指定文件或目录的更改时间更接近现在的文件或目录;
-size<+|-|=文件大小>:查找符合指定的文件大小的文件;
-type<文件类型>:只寻找符合指定的文件类型的文件;
-a:是前后条件都要满足;
-o :是满足一个条件就好;
+:表示大于设置值的文件;
- :表示小于设置值的文件;
= :表示等于设置值的文件;
注意:通常使用find
命令的时候使用root
权限,这样就有权限查找任何目录下的内容,本平台默认权限是root
权限,所有在本平台上执行find
命令时不需要加sudo
。
案例演示1
:
查找/etc
目录下以my
开头以.conf
结尾的文件或目录,具体使用如下命令:
sudo find /etc -name "my*.conf"
*
表示任意字母。
案例演示2
:
查找/etc
目录下在超过7
天前被访问的文件或目录,具体使用如下命令:
sudo find /etc -atime +7
案例演示3
:
查找/etc
目录下恰好在7
天前被访问的文件或目录,具体使用如下命令:
sudo find /etc -atime 7
案例演示4
:
查找/etc
目录下在5
分钟内被访问的文件或目录,具体使用如下命令:
sudo find /etc -amin -5
-type 文件类型
使用方法
常见文件类型:
f:普通文件
l:符号链接
d:目录
c:字符设备
b:块设备
s:套接字
p:Fifo
案例演示:
查找/etc
目录下以my
开头的目录,具体使用如下命令:
sudo find /etc -name "my*" -a -type d
size <+|-|=文件大小>
使用方法
常见文件大小单位:
b —— 块(512字节)
c —— 字节
w —— 字(2字节)
k —— 千字节
M —— 兆字节
G —— 吉字节
案例演示:
查找/etc
目录下大于1M
的文件,具体使用如下命令:
sudo find /etc -size +1M
-exec
使用方法
具体使用方法如下:
find … -exec 要执行的命令 {} \\;
-exec
选项后面跟随着所要执行的命令或脚本,然后是一个空格一对儿{}
一个空格和一个\\;
。
注意:要执行的命令和{
之间以及}
与\\;
之间的空格是不能省略的。
案例演示:
查找/etc
目录下大于1M
的文件/目录的详细信息,具体使用如下命令:
sudo find /etc -size 1M -exec ls -l {} \\;
编程要求
请在右侧编辑器中补充代码,使用find
命令查找文件或目录,具体编程要求如下:
使用
find
命令查找当前目录中所有以.conf
结尾的文件/目录;使用
find
命令查找当前目录中所有以my
开头的目录;使用
find
命令查找/root
目录中大于1M
的文件;使用
find
命令查找/root
目录中类型为符号链接且文件名以 Link 结尾的所有链接详细数据(提示使用ls -l
查看文件详细数据)。
测试说明
平台将对你编写的代码进行评测:
注意:本平台默认权限是root
,所以执行命令不需要加sudo
。
预期输出:
查找当前目录中所有以.conf结尾的文件/目录成功
查找当前目录中所有以my开头的目录成功
查找/root目录中大于1M的文件成功
查找/root目录中所有符号链接的文件详细数据成功
胜利者往往是从坚持最后五分钟的时间中得来成功。——牛顿
开始你的任务吧,祝你成功!
#!/bin/bash
#在以下部分写出完成任务的命令
#***********begin*************#
find . -name "*.conf"
find . -name "my*"
find /root -type f -size +1M
find /root -type l -name "*Link" -exec ls -l {} \\;
#************end**************#
以上是关于EduCoder Linux之文件/目录搜索的主要内容,如果未能解决你的问题,请参考以下文章