Linux查找文件

Linux文件查找技巧

查找文件,无所遁形

locate命令,快速查找

第一种方法 “locate”,英语“定位”的意思
用于定位要查找的文件
方法很直观,后接文件名,也可以接正则表达式
例如我们查找一个叫做Pictures的文件
我们用locate Pictures
在这里插入图片描述
用locate function,会找到所有包含function的文件或目录

但是大家会发现,我刚创建的文件,为什么用locate命令找不到呢
这正好是locate命令的缺陷
locate 命令不会对你实际的整个硬盘进行查找
而是在文件的数据库里查找记录
原理如下图所示
在这里插入图片描述对于刚刚创建不久的文件,因为它们还没有被收录到文件数据库
因此locate命令就找不到其索引,自然就不会返回任何结果
linux系统一般每天更新一次文件数据库
隔24个小时你就能到你刚才创建的文件了
但是你会想,不想等那么久啊
我们可以用updatadb命令强制系统立即更新文件数据库
updatadb命令只能root用户执行
所以用sudo updatadb
在这里插入图片描述这样就可以找得到了,我刚创建的文件就找到了,因为更新了文件数据库
小结一下locate命令方便快捷,易于使用。到那时缺点很明显
locate命令实在文件数据库中找寻文件,如果结果太多了,太复杂,就会很慢
locate命令不能找到1天之内创建的文件
除非你先用root身份运行updatedb命令对文件数据库进行更新
多以,当locate数据库不能使用时呢,我们就需要一个更强大的命令就是find命令。

find命令,深入查找

find命令是查找文件的利器
而且它允许我们对每个找到的文件进行后续操作
与locate命令不同的是,find命令不会再文件数据库中查找文件的记录
他会遍历你的实际硬盘,如果你的硬盘大的话,它也会比较久的查找
find的原理如下图所示
在这里插入图片描述这种耿直的查找方式保证我们不会遗漏我们一天之内创建的文件,但是这并不是它的强大之处
find命令的用法是
find 《何处》 《何物》 《做什么》
这几个参数之中只有《何物》时必须指定的,也就是要查找什么
一个个的看这几个参数
何处:指定在哪个目录中查找
此目录中的所有子目录也会被查找
与locate命令的查找所有文件数据库的所有记录不同
find命令可以限定查找目录。比如可以只让find查找/home目录
加入我们没有给出何处这个参数,那么find命令会在当前目录及其子目录中查找
何物:也就是要查找什么,我们可以根据文件名字来查找
也可以根据其大小来查找
也可以根据最近访问时间来查找,等等,这个参数是必传的
做什么:用find命令查找到我们要的文件后
我们对这个文件执行什么后续操作,成为 后续处理
如果不传入这个参数,那么久不会执行操作,只显示文件的位置

find命令的基础用法

根据文件名查找
find -name “file_name”
这里我们用-name参数指定了文件的名字
,是new_file,要用引号括起来
如果find命令没有结果,则表示此文件不存在
因为我们没有指定何处这个参数
所以find命令则会在当前目录及其子目录下进行查找
假如我现在在我的家目录中但是我想在其他目录下查找文件怎么办呢?
那就需要添加《何处》这个参数了
例如,我要在/var/log目录下查找名为syslog的文件

find /var/log -name "syslog"

在这里插入图片描述
如果不想看到Permission denied这些信息,你就可以切换root身份来查找即可
在这里插入图片描述
这个Permission shi ‘许可’的意思,denied是‘否决’的意思,
连起来就是权限被否决,没有权限做这些事情
就可以切换root身份,再来执行查找命令即可
上边的查找中我们的参数是这样的
《何处》: /var/log 以及他的子目录
《何物》:syslog
《做什么》:没有指定,find默认显示查找到的文件

与locate命令的不同之处是:
find只能查找完全符合《何物》的字符串表示的文件
locate是查找包含关键字的文件
也可以使用通配符:
**例如:**我要查找到所有以syslog关键字开头的文件

find /var/log -name "syslog*"

查找结尾的只要将统配符放在前边即可

find /var/log -name "*syslog"

如果查找包含这个关键字的文件,则:

find /var/log -name "*syslog*"

如果要在整个硬盘里查找呢?

find / -name "syslog"

在这里插入图片描述

根据文件大小查找

如果你不知道文件的名称怎么办呢
例如:我们可以root身份查找 /var 中大小超过10M的文件

sudo su
find /var -size +10M

在这里插入图片描述我们这次用了-size参数,来指定查找文件的大小

如果我们要是查找指定大小的文件,可以用-

find /var -size -50k

根据文件的最近访问时间查找

如果你记得你近7天在家目录中访问过txt格式文件
但是你忘记了名字,如果查找呢
可以使用-atime参数。atime是access和time的缩写
access是访问的意思,time是时间

find -name "*.txt" -atime 7

atime 后的-7是表示小于7天也就是7天之内,- 的意思是表示小于

仅查找文件或目录

我们可以指定文件类型查找
liuux文件类型大致分两种,文件与目录
因此,我们可以用-type的方法来指定查找文件的类型

-type d:只查找目录类型
-type f:只查找文件类型

如果不用-type参数指定类型
那么find命令默认是同时查找目录和文件

find -name "new_file" -type d
find -name "new_file" -type f

在这里插入图片描述

find命令的高级用法:操作查找结果

到目前为止,我们只是使用了find的基本功能
我们并没有指定《做什么》这个参数
也就是还没有对查找到的结果做任何操作
当然了,默认的find命令会显示查找到的文件
事实上,find -name “.jpg"等价于find -name ".jpg” -print
这是默认的
我们还可以用格式化的方式打印出来
可以使用-printf参数(print formatted,格式化打印的缩写)
例如,我们可以这样打印查找到的内容

find -name "*.txt" -printf "%p - %u\n"

在这里插入图片描述
%p: 文件名
-:就是一个短横杠
%u:文件的所有者,这里是我的用户名,所以是zhao
意思就是在当前目录下查找 “.txt”结尾所有文件,以文件名-用户名的格式打印输出

删除找到的文件

加入我们要删除查找到的文件,我们可以用-delete参数

find -name "*.txt" -delete

这意思就是删除当前目录及其子目录下所有的 .txt 结尾的文件
而且不会有确认提示,直接删除,所以慎用-delete参数

调用命令

使用-exec参数,可以后接一个命令参数,对每个查找到的文件进行操作
exec是excute的缩写,执行的意思
加入要将one目录下所有查找到的txt文件的访问权限都改为600

find one -name "*.txt" -exec chmod 600 {} \;

在这里插入图片描述

{}表示查找到的每个文件来替换
\;是必须得结尾

虽然-exec优点看不懂他
但是慢慢就会发现其强大
你可以对你查找到的文件做你想要做的任何操作
如果你对于没有确认提示不太放心
你可以将-exec 参数换成-ok参数,用法一样
只不过-ok参数会对每一个查找到的文件都做确认提示
在这里插入图片描述

总结

为了在Linux硬盘中查找一个文件,可以用locate命令
但是他不是在硬盘中查找,而是在文件数据库中查找
文件数据库24小时才会更新,所有locate查不到24小时之内创建的文件
但是我么可以用即可更新文件数据库的sudo updatedb来更新文件数据库之后再次进行查找操作

find命令比locate命令更强大,用法也更多样
他会遍历实际的硬盘来查找文件,所以更慢,更精确
find命令后可以跟三个参数,《何处》《何物》《做什么》
可以根据名字来查找 -name
可以根据大小来查找 -size
可以根据类型来查找 -type
可以根据最后访问时间来查找 -atime
找到了文件我们也可以选择不显示
而是删除文件 -delete
或者对文件执行操作 -exec
不要忘记 {} 对每个文件都可以执行
;必须得结尾

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值