深度解析Linux查找文件极查询高级命令详解 - 学习笔记2012-2-6

时间:2021-07-26 09:19:54

  前言                                

Linux控制台情况下,想要查询到想要的文件详细大家都会使用简单的命令去寻找(例如:find)

可是问题来了?我如果想准确查找某个文件??

例如要寻求这样一个文件:名称含有 ”ass” 字符,且是可执行文件,以及是在2天前由bajie这个用户创建的。

亲、这样你如果执意去用 find 命令估计要手酸了……

  涉及命令如下                                

1、which

2、whereis

3、locate

4、find

  which命令详解                                

释义:which 指令会在环境变量$PATH设置的目录里查找符合条件的文件

  首先要确认查找的文件路径在 该用户的 $PATH 环境变量内(每个用户的 $PATH 变量时不同的)。

  首先如何查看用户 $PATH 环境变量呢?

  Linux终端下输入 echo $PATH 系统会在终端输出当前用户$PATH变量内容。

  例如笔者的 $PATH 如下:

深度解析Linux查找文件极查询高级命令详解 - 学习笔记2012-2-6

案例1:(查询 passwd 文件因为 passwd 路径在$PATH内 )

[root@localhost root]# which -a passwd
/usr/bin/passwd

这里的 参数 -a 意思是查找所有符合条件的文件并输出,而非直输出第一个(重要)

案例2:(查询不在 $PATH 内的文件发生如下错误)

[root@localhost root]# which mydata
/usr/bin/which: no mydata in (/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/X11R6/bin:/root/bin)

关于which还有如下参数:

 -n<文件名长度>  指定文件名长度,指定的长度必须大于或等于所有文件中最长的文件名。
 -p<文件名长度>  与-n参数相同,但此处的<文件名长度>包括了文件的路径。
 -w  指定输出时栏位的宽度。
 -V  显示版本信息

再啰嗦一句:一定确定要查找的文件在该用户 $PATH 环境变量不了内!!错了别找我。。。阿门~~

  whereis明显详解                                

释义:在系统数据库中存在文件结构查找文件

注:系统数据库每天更新一次 (根据Linux发行版本不同可能有所区别)

优点:数据库查找速度方面肯定比 find 物理硬盘查找的速度快N倍!

缺点:无法查询数据库中不存在 或 物理硬盘新建(未超过一天),数据库不存在的文件。

 该命令日常使用相对较为频繁

参  数:
 -b  只查找二进制文件。 
 -B<目录>  只在设置的目录下查找二进制文件。 
 -f  不显示文件名前的路径名称。 
 -m  只查找说明文件。 
 -M<目录>  只在设置的目录下查找说明文件。 
 -s  只查找原始代码文件。 
 -S<目录>  只在设置的目录下查找原始代码文件。 
 -u  查找不包含指定类型的文件。

案例1:

[root@localhost root]# whereis passwd
passwd: /usr/bin/passwd /etc/passwd /etc/passwd.lock /usr/share/man/man1/passwd.1.gz /usr/share/man/man5/passwd.5.gz
[root@localhost root]# whereis -b passwd
passwd: /usr/bin/passwd /etc/passwd /etc/passwd.lock

可以看到第一个无 -b 命令查找到5个文件,第二个命令只查找到3个 (-b为只查找二进制文件)

 速度明显比find快。。。亲、自己去体验吧。。

 

  locate命令详解                                

释义:查找文件(数据库内查找)

参数:

-i :忽略查找文件名的大小写

-r :后面可接正则表达式的显示方式

用法很简单,直接 locate 文件的部分名称 即可。

 

问题来了:刚才我创建了3个文件,我只记得2个,还有一个是wukong开头的其他的忘了。。。

怎么办?? whereis ? ?那你肯定找不到。。。为什么??你懂得。

怎么办??运行命令 updatedb(更新系统数据库)

再使用whereis 哦了~~

updatedb 命令详解:

该命令运行后 命令回去读取 /etc/updatedb.conf 配置文件,然后去硬盘里进行查找文件操作,最后更新整个数据库文件(/var/lib/mlocate 内的数据库文件)。

因为updatedb回去硬盘上查找文件,速度可能会等几分钟。。。

  find命令详解                                

注:该命令由于效率问题不常用 (以上命令查不到情况下,可使用 find 直接查找硬盘文件)

特点:直接查找硬盘 准确 (ps:该函数查不到,那你就绝望吧。。)

用法:find [PATH] [option] [action]

参数:

1、时间有关参数:-atime -ctime -mtime 以下以 -mtime为例

  -mtime n :n为数字,意义在n天之前的 “一天之内” 被更改过的文件;

  -mtime +n :列出在n天之前(不含n天本身)被更改过的文件;

  -mtime -n :列出在n天之内(不含n天)被更改过的文件;

  -newer file :file为一个存在的文件,列出比file文件还要新的文件名。

案例1:

[root@localhost root]# find / -mtime 0
/
/lost+found
/boot
/boot/lost+found
/boot/grub
/boot/grub/grub.conf
/boot/grub/fat_stage1_5
/boot/grub/ffs_stage1_5

………………(太多了不列出来了...)

注意命令后面的 0 意思是文件修改时间不超过24小时 (从现在开始到24小时前),

3天前24小时内 命令为:find / -mtime 3 (具体释义详见下图)

案例2:[root@localhost root]# find /etc -newer /etc/passwd

--newer 命令对应分辨2个文件的新旧程度很重要

深度解析Linux查找文件极查询高级命令详解 - 学习笔记2012-2-6

find 高级应用:

2、与用户和用户组有关的参数:

-uid n:n为用户账户的id 即 uid ,用户uid记录在 /etc/passwd文件内

-gid n:n为用户组的id即gid ,用户组gid记录在 /etc/group文件内

-user name:name为用户名,查找XX用户的文件

-group name:name为用户组名,查找属于XX用户组的文件

-nouser :寻找不属于当前系统用户的文件(僵尸文件。。。)

-nogroup :寻找不属于当前系统用户组的文件

案例1:find /etc -user bajie

查找 /etc目录下属于用户bajie的文件

案例2:find / -nouser

查找僵尸文件。。。。(并不可怕,也可能是编译文件产生的或网络下载的)

3、与文件权限及名称有关的参数:

--name filename:filename为文件名

--size [+-]SIZE:查找比SIZE还要大(+),或下(-)的文件,SIZE大小规格有:c:代表byte,k代表1024bytes. 要找50KB还要大的文件:"-size +50k"

  (还有M G)不知道为什么我用不成功。。。

--type TYPE:查找符合类型的文件。 类型有:一般文件 f ,设备文件(b ,c) ,目录(d),连接文件(l),socket(s),FIFO(p)

--perm mode:查找文件权限刚回等于mode的文件

--perm -mode:查找文件权限必须 包含 mode权限的文件

  需要查找 -rwxr--r--,即0774的文件,使用 --perm -0774

--perm +mode:查找文件权限符合 任意 mode权限的文件

  需要查找 -rwsr-xr-x,即-perm +755 时,但有一个文件属性为 -rw-------也会被列出来,因为他有 -rw...的属性存在。

注:--perm可查询除 rwx 以外的隐藏权限文件,这里不探讨隐藏权限

 

今天就写到这了。。。明天探讨关于linux除rwx属性外的其他隐藏属性。

欢迎大家积极讨论。。小生倍受鼓舞,感表涕零。