《Linux系统》之"皮毛系列"(六) 文件搜索相关命令

为什么要使用搜索命令呢?

第一:随着时间的流逝,文件系统中的文件越来越多,我们不可能记住所有文件的位置或内容(除非你是天才中的天才,呵呵呵)。
第二:不同版本的Linux,系统文件或者是应用程序所需要的文件的存储位置可能会有所差别。

因此Linux系统提供了一些文件搜索命令,供我们搜查我们所要寻找的文件。

一、命令文件的搜索

在命令模式下,连续输入两次[tab]键就可以知道当前用户有多少命令可以使用。我们还知道,每个命令其实都应该对应一个可执行文件。但是,你知道那个文件放在哪里吗?我们可以使用which或type命令来帮助我们搜索。

1、which命令

命令路径:/usr/bin/which                 
执行权限:所有用户                             
功能描述:查找系统命令的可执行文件所在目录并显示 
语法:which  [命令名称]

案例1:
[root@master bin]# which ls
alias ls='ls --color=auto'
        /bin/ls
解析:/bin/ls是文件的全路径。alias是别名的含义,即输入ls 相当于输入ls --color=auto。

案例2:
[root@master bin]# which pwd
/bin/pwd                            
解析:路径显示为/bin/pwd

案例3:
[root@master bin]# which cd
/usr/bin/which: no cd in (/usr/lib64/qt-3.3/bin:/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/hyxy/bin)
解析:我们可以发现 cd命令完全可以使用,但是为什么查不到cd的位置呢?因为cd是bash的内置命令

什么是内置命令?。就是在bash内部定义的命令,换句话说,只要有bash存在,就可以直接使用的命令,没有自己的可执行文件。我们还可以发现which命令其实是在PATH环境变量里进行查找。也就是没有设置到环境变量里的命令,我们也查询不到。

那么,我们怎么查看命令是不是内置命令呢?可以通过type命令哦!

2、type命令

命令路径:内置命令
执行权限:所有用户
功能描述:用于显示命令的类型或命令的所在位置
语法格式:type [命令名称]

案例1:
[hyxy@master ~]$ type ls
ls is aliased to `ls --color=auto'
案例2:
[hyxy@master ~]$ type mkdir
mkdir is /bin/mkdir
案例3:
[hyxy@master ~]$ type cd
cd is a shell builtin

二、find命令的使用

在文件系统中,除了有与命令有关的文档外,还有各种类型的、数量非常庞大的文件。find命令提供了各种搜索条件,功能非常强大,我们可以使用find命令在众多文件或目录下查找你想要的任何文件或目录。

命令路径:/usr/bin/find
执行权限:所有用户
功能描述:用于查找文件或者是目录。
语法格式: find  [path]  [option]  [action]

因为option太多了,下面以案例的形式,说说常用的option和action。

案例1:以文件名的形式【-name】在某一目录下查找文件。

[root@admin 桌面]# find /etc -name init
/etc/sysconfig/init
/etc/init
/etc/kdump-adv-conf/kdump_initscripts/init

# 解析:/etc是目录,-name是选项,用于指定要以名称来查找,后面的参数就是要查找的文件名。
# PS:查找的范围是指定目录及其子目录。  
# 文件名可以使用通配符,如*和?。

案例2:以文件大小的形式【-size】在某一目录下查找文件

[michael@admin test]$ ls -lh
总用量 16K
-rw-rw-r--. 1 michael michael 2.9K 12月 19 18:37 b.java
-rw-rw-r--. 1 michael michael  842 12月 19 18:41 c.txt
-rw-rw-r--. 1 michael michael  853 12月 19 18:40 m
drwxrwxr-x. 2 michael michael 4.0K 12月 15 06:27 test

# 在test目录下,有这四个文件,大小如上:当我们执行下面语句时:
[michael@admin test]$ find  . -size +1 -a -size -3
./m
./c.txt

# 解析:在当前目录下查找文件大于512字节,小于1024字节的文件。
# 大于使用加号(+),小于使用减号(-), 多条件使用-a(and)或-o(or)连接。
# 这里说明一下,linux默认按照数据块的个数查询,而数据块的大小为512字节。
# 因此这种方式的查询,需要我们先计算一下。如查询500M以下的文件,应该是500*1024*2。即-1024000.
# 如果包含500M的,别忘记+1哦

#当然,我们也可以指定单位如 c,k,M,G等等

案例3:以文件所有者的形式【-user】在某一目录下进行查找文件

[michael@admin test]$ find /etc/ssh -user root
/etc/ssh
/etc/ssh/ssh_host_rsa_key.pub
/etc/ssh/ssh_host_rsa_key
/etc/ssh/moduli
...........

# 解析: 在/etc/ssh目录下,查找所有者为root的文件

案例4:以【-atime】、【-mtime】、【-ctime】等选择进行查找。

在练习案例4之前,我们先来了解一下Linux下文件的三种时间属性:atime、mtime、ctime。

1、atime:访问时间(access time)。显示的是文件中的内容最后被访问的时间。

2、mtime:修改时间(modify time)。显示的是文件内容被修改的最后时间。

3、ctime:状态数据修改时间(change time),显示的是文件的属性,如权限,所有者,链接数等等发生改变的时间

[michael@admin test]$ find /home/michael -ctime -1
/home/michael
/home/michael/.config/ibus/bus
/home/michael/.config/ibus/bus/9af14ed9d4e600a51d09bc6c0000000e-unix-0
/home/michael/.xsession-errors.old
/home/michael/.dbus/session-bus/9af14ed9d4e600a51d09bc6c0000000e-0
/home/michael/.ICEauthority
/home/michael/test
/home/michael/test/t
/home/michael/test/m
/home/michael/test/b.java
/home/michael/test/c.txt

# 在目录/etc/michael下,查找24小时文件属性被修改过的文件
# 默认单位是天。

案例5:以文件类型的形式【-type】在某一目录下进行查找并列出文件详细

[michael@admin test]$ find ./ -type f -exec ls  -l {} \;
-rw-r--r--. 1 root root 0 12月 19 19:11 ./t
-rw-rw-r--. 1 michael michael 853 12月 19 18:40 ./m
-rw-rw-r--. 1 michael michael 2932 12月 19 18:37 ./b.java
-rw-rw-r--. 1 michael michael 842 12月 19 18:41 ./c.txt

# 解析:查找当前目录下文件类型是 f的文件,并显示文件的属性

-exec【execute】这个选项的作用是:对find命令查找到的文件进行额外的命令操作。
格式:-exec 【command】【选项】 {}  \;
{}:固定写法,集合的含义,表示find查询出来的结果集。
\:为转义字符,对;进行转义,表示命令结束。注意:集合和转义字符之间需要有空格

案例6:在当前目录下查找目录,并进行删除操作。

[michael@admin test]$ find ./ -type d -exec rm -rf {} \;

-这个案例中要求我们进行删除操作,有一定的弊端,要是有比较重要的目录,就直接删除了。我们可以使用-ok来替换-exec,它的作用是在将要执行额外的操作时,进行询问是否要执行此操作,y(yes) or n(no)。

案例7:在当前目录下查询名为dddd的文件,打印【-print】后,在查看文件的内容

[michael@admin test]$ find ./ -name dddd -print -exec cat {} \;
./dddd
helloworld

# -print,打印查到的文件或目录

案例8:查找权限【-perm】为644的文件或目录(需完全符合)

[michael@admin test]$ find ./ -perm 664
./dddd
./m
./b.java
./c.txt

find功能虽然强大,但是因为要从磁盘上进行查找,因此当文件系统内的文件数量很多时,性能低,速度慢。指定目录后,也会遍历子目录,因此建议要尽可能的精确指定查询的目录,以便提高效率。尽量不要在根目录下直接查询文件。

三、搜索性能高的几个命令

find命令要对硬盘进行搜索,性能低。因此一般我们都是先使用 whereis 或者是 locate 來搜索。如果真的找不到,才会用 find 命令!那么为什么呢?因为 whereis 只找系统某些特定目录底下的文件而已,locate则是linux系统内维护的文件数据库进行搜索,而不是搜索硬盘上的文件系统。因此省时间,性能高。

1、whereis

命令路径:/usr/bin/whereis
执行权限:所有用户
语法格式:whereis  [-sbmu]  文件或目

-s:只找source来源文件
-b:只找binary格式的文件
-m:只查找在说明目录manual(man)里的文件
-u:查找不在上述三个选项当中的其他特殊文件

案例1:查找ifconfig这个文件名

[root@admin manual]# whereis ifconfig
ifconfig: /sbin/ifconfig /usr/share/man/man8/ifconfig.8.gz

案例2:查看ls这个文件名

[root@admin manual]# whereis ls     #特定路径下的文件全部查了出来
ls: /bin/ls /usr/share/man/man1/ls.1.gz /usr/share/man/man1p/ls.1p.gz

[root@admin manual]# whereis -m ls  #只有在man目录里的文件才显示出来
ls: /usr/share/man/man1/ls.1.gz /usr/share/man/man1p/ls.1p.gz

whereis这个命令只在几个特定的目录下进行查找,如/bin、/sbin、/usr/share/man目录,并没有在整个文件系统上去查找。因此性能要比find高。注意:没有添加任何选项时,就会显示所有的文件。

2、locate\updatedb

locate这个命令是通过关键字来查找文件或目录的(只要文件名或目录名中含有此关键字,就能查出来)。Linux系统在/var/lib/mlocate/目录下维护着一个资料库,我们称之为文件数据库。locate命令就是在这个数据库内查找文件。因此性能要比find要高很多。

命令原意:list files in databases
命令路径:/usr/bin/locate
执行权限:所有用户
功能描述:通过关键字来查找文件或目录
语法:locate 【选项】【关键字】

-i:忽略大小写;
-c:不输出文件名,只返回文件的数量
-l:只输出查找出来的文件的前几个。如:-l 5,输出前五个文件
-r:列出数据库中维护的文件数目和数据。

案例1:查看名称中含有test关键字的文件的前五个

[michael@admin root]$ locate -l 5 test    # 列出前5个
/etc/sane.d/test.conf
/etc/yum/pluginconf.d/fastestmirror.conf
/home/michael/test
/home/michael/.cache/mozilla/firefox/dkomn2zg.default/safebrowsing/test-block-simple.pset
/home/michael/.cache/mozilla/firefox/dkomn2zg.default/safebrowsing/test-block-simple.sbstore

案例2:查询文件数据库里的数据

[michael@admin root]$ locate -S
数据库 /var/lib/mlocate/mlocate.db:
	12,567 文件夹
	123,852 文件
	7,012,995 bytes in file names
	2,943,819 字节用于存储数据库

案例3:新建一个文件,然后使用locate进行查询

[michael@admin ~]$ touch file_111     #新建一个文件file_111
[michael@admin ~]$ locate file_111    #使用locate命令进行查询
[michael@admin ~]$

我们会发现新建的文件根本没有查询到。那是因为,文件数据库默认一天更新一次。而我们刚刚建立的文件,还没有更新到文件数据库中,所以查询不到。

此时,我们可以使用命令updatedb,让命令搜索硬盘,然后即时更新文件数据库(有可能要等待几分钟)。这样就可以查询到我们才创建不到一天的文件了。注意:updatebd命令的执行权限只有root用户才可以。

[michael@admin ~]$ touch file_111
[michael@admin ~]$ locate file_111
[michael@admin ~]$ su              # 切换到root用户
密码:
[root@admin michael]# updatedb     #搜索硬盘,更新文件数据库,可能需要等等几分钟
[root@admin michael]# locate file_111   
/home/michael/file_111             # 可以查询到结果了

---------------------------------------------------------------------未完待续,敬请留言----------------------------------------------------------------------------------

猜你喜欢

转载自blog.csdn.net/Michael__One/article/details/85085907