Linux命令学习(二)

前言

接上文,本文接着来学习Linux的命令。本文要学习的命令包含:cpmvrmcaldatewhereiswhatislocate

1. cp命令

cp是单词copy的缩写,该命令用于复制文件或者目录,命令格式:cp 源文件 目标地址,可将单个或多个文件复制到目标目录。我们以一些例子来了解一下它的使用:

    1. 不加任何参数,直接使用cp命令进行复制:
[mrzhang@192 Documents]$ mkdir testcp1
[mrzhang@192 Documents]$ mkdir testcp2
[mrzhang@192 Documents]$ cd testcp1
[mrzhang@192 testcp1]$ cat > test.log << EOF
> in order to test cp
> EOF
[mrzhang@192 testcp1]$ ll
total 4
-rw-rw-r--. 1 mrzhang mrzhang 20 Jun 11 22:51 test.log
[mrzhang@192 testcp1]$ cp test.log ../testcp2/
[mrzhang@192 testcp1]$ cd ../testcp2/
[mrzhang@192 testcp2]$ ll
total 4
-rw-rw-r--. 1 mrzhang mrzhang 20 Jun 11 22:52 test.log

如果我们要复制多个文件,只需要使用空格将每个文件分开即可,并且我们直接复制的时候,两个文件的时间是不一样的,我们可以通过使用-a参数,来设置复制后的文件的时间一致。

[mrzhang@192 testcp1]$ cp -a test.log ../testcp2/

如果复制的时候目标目录中已经有该文件,我们可以使用-i参数来提示我们是否进行覆盖:

[mrzhang@192 testcp1]$ cp -i test.log ../testcp2
cp: overwrite ‘../testcp2/test.log’? y
[mrzhang@192 testcp1]$ 

当然这是在目标目录下已经存在该文件时会有提示信息,如果不存在该文件,则不会提示。

    1. 复制文件夹,我们使用-r或者-R参数来实现,该参数表示递归操作。而复制文件夹又分为两种情况:目标文件夹不存在时候的复制和目标文件夹存在的情况下的复制。对于目录不存在的情况,就很简单了,直接复制:
[mrzhang@192 Documents]$ cd testcp
[mrzhang@192 testcp]$ ll
total 0
[mrzhang@192 testcp]$ mkdir testcp1
[mrzhang@192 testcp]$ cd testcp1/
[mrzhang@192 testcp1]$ cat > read.log <<EOF
> test
> EOF
[mrzhang@192 testcp1]$ cd ..
[mrzhang@192 testcp]$ cp -a testcp1 testcp2
[mrzhang@192 testcp]$ ll
total 0
drwxrwxr-x. 2 mrzhang mrzhang 22 Jun 11 23:05 testcp1
drwxrwxr-x. 2 mrzhang mrzhang 22 Jun 11 23:05 testcp2

而对于目录已经存在的情况下,源目录将会被复制到目标目录的下一层:

[mrzhang@192 testcp]$ ll
total 0
drwxrwxr-x. 2 mrzhang mrzhang 39 Jun 11 23:06 testcp1
drwxrwxr-x. 3 mrzhang mrzhang 37 Jun 11 23:10 testcp2
[mrzhang@192 testcp]$ mkdir testcp3
[mrzhang@192 testcp]$ ll testcp3
total 0
[mrzhang@192 testcp]$ cp -r testcp1 testcp3
[mrzhang@192 testcp]$ ll testcp3/
total 0
drwxrwxr-x. 2 mrzhang mrzhang 39 Jun 11 23:15 testcp1
[mrzhang@192 testcp]$ 
    1. 创建文件的一个链接,来链接到具体的文件,也就是快捷方式,可以使用-l来实现:
[mrzhang@192 testcp]$ ll
total 0
drwxrwxr-x. 2 mrzhang mrzhang 39 Jun 11 23:06 testcp1
drwxrwxr-x. 2 mrzhang mrzhang 22 Jun 11 23:21 testcp2
[mrzhang@192 testcp]$ ll testcp2/
total 4
-rw-rw-r--. 1 mrzhang mrzhang 5 Jun 11 23:05 read.log
[mrzhang@192 testcp]$ cp -l testcp1/write.log testcp2/
[mrzhang@192 testcp]$ ll testcp2/
total 8
-rw-rw-r--. 1 mrzhang mrzhang 5 Jun 11 23:05 read.log
-rw-rw-r--. 2 mrzhang mrzhang 9 Jun 11 23:06 write.log
    1. 另一种链接被称为软链接或者符号链接,我们通过-s来实现:
[mrzhang@192 testcp]$ cp -s testcp1/write.log testcp2
cp: ‘testcp2/write.log’: can make relative symbolic links only in current directory
[mrzhang@192 testcp]$ cd testcp2/
[mrzhang@192 testcp2]$ cp -s ../testcp1/write.log write.log
[mrzhang@192 testcp2]$ ll
total 4
-rw-rw-r--. 1 mrzhang mrzhang  5 Jun 11 23:05 read.log
lrwxrwxrwx. 1 mrzhang mrzhang 20 Jun 11 23:27 write.log -> ../testcp1/write.log

可以看到,最终软链的地址指向了实际的地址,这里要注意下,软链的创建只能在当前目录下进行。

由于cp命令的参数特别多,如果大家感兴趣,可以参考以下链接了解更多:
Linux cp 命令的15个示例 - 创建文件和目录的副本

2. mv命令

  mv是单词move的缩写,该命令可以用来移动文件或更改文件名及目录名称,命令格式是:mv 源文件 目标文件。如果mv命令中第二个参数类型是文件时,mv命令用于文件重命名;如果第二个参数是已存在的目录名称,那么mv命令将源文件移至目标目录中。

-u 若目标文件已经存在, 并且源文件比目标文件新时 才会进行覆盖
-i 若目标文件已经存在, 移动前询问是否覆盖
-f force强制的意思,意思是无条件覆盖已经存在的文件,如果同时使用了-f和其他的参数,那么以-f为准
-n 修改名称时,不会覆盖掉任何已经存在的文件
-b 文件被覆盖前做简单备份
-v 移动时展示移动的内容信息
-t --target-directory=DIRECTORY 即指定mv的目标目录,该选项适用于移动多个源文件到一个目录的情况,此时目标目录在前,源文件在后

同样,接下来我们通过一些例子来学习该命令的使用:

    1. 直接修改文件文件名:
[mrzhang@192 testmv]$ ll
total 4
-rw-rw-r--. 1 mrzhang mrzhang 15 Jun 13 20:45 mv1.log
[mrzhang@192 testmv]$ mv mv1.log mv.log
[mrzhang@192 testmv]$ ll
total 4
-rw-rw-r--. 1 mrzhang mrzhang 15 Jun 13 20:45 mv.log
    1. 移动文件到某一目录下:
[mrzhang@192 testmv]$ mkdir testmv1
[mrzhang@192 testmv]$ ll
total 4
-rw-rw-r--. 1 mrzhang mrzhang 15 Jun 13 20:45 mv.log
drwxrwxr-x. 2 mrzhang mrzhang  6 Jun 13 20:55 testmv1
[mrzhang@192 testmv]$ mv mv.log testmv1/
[mrzhang@192 testmv]$ ll
total 0
drwxrwxr-x. 2 mrzhang mrzhang 20 Jun 13 20:55 testmv1
[mrzhang@192 testmv]$ ll testmv1/
total 4
-rw-rw-r--. 1 mrzhang mrzhang 15 Jun 13 20:45 mv.log

如果同时将移动多个文件到某一文件下,多个文件之间可以使用空格进行区分:

[mrzhang@192 testmv]$ mv mv.log mv1.log testmv1/

当然,也可以使用通配符来移动,比如移动全部 log 文件到目标目录下:

[mrzhang@192 testmv]$ mv *.log testmv1/
    1. 将文件file1改名为file2,如果file2已经存在,则修改时询问是否覆盖,可以通过-i 参数来实现 ;而默认情况下,如果file2已经存在,那么file2将会直接覆盖,这等同于另一个参数 -f,也就是强制的意思,即不管file2是否存在,都直接覆盖:
[mrzhang@192 testmv1]$ ll
total 8
-rw-rw-r--. 1 mrzhang mrzhang 3 Jun 13 21:01 test1.log
-rw-rw-r--. 1 mrzhang mrzhang 4 Jun 13 20:58 test2.log
[mrzhang@192 testmv1]$ mv -i test1.log test2.log 
mv: overwrite ‘test2.log’? y
[mrzhang@192 testmv1]$ ll
total 4
-rw-rw-r--. 1 mrzhang mrzhang 3 Jun 13 21:01 test2.log
[mrzhang@192 testmv1]$ 
[mrzhang@192 testmv1]$ mv -f test1.log test2.log 
    1. 移动目录,或者对目录修改名称:
[mrzhang@192 testmv]$ ll
total 0
drwxrwxr-x. 2 mrzhang mrzhang 6 Jun 13 21:06 testmv1
[mrzhang@192 testmv]$ mv testmv1 testmv2
[mrzhang@192 testmv]$ ll
total 0
drwxrwxr-x. 2 mrzhang mrzhang 6 Jun 13 21:06 testmv2
[mrzhang@192 testmv]$ mkdir testmv3
[mrzhang@192 testmv]$ mv testmv2 testmv3
[mrzhang@192 testmv]$ ll
total 0
drwxrwxr-x. 3 mrzhang mrzhang 21 Jun 13 21:07 testmv3
[mrzhang@192 testmv]$ ll testmv3/
total 0
drwxrwxr-x. 2 mrzhang mrzhang 6 Jun 13 21:06 testmv2

从上面可以看出,针对移动目录命令:mv dir1 dir2,如果目标目录dir2不存在,则将目录dir1名称修改为dir2,而如果dir2存在,则将目录dir1移动至dir2目录下。另外,如果想在使用mv的时候查看具体的信息,可以使用-v 参数查看移动或修改的具体信息:

[mrzhang@192 testmv2]$ mv -v test1.log test2.log
‘test1.log’ -> ‘test2.log’
[mrzhang@192 testmv2]$ ll
total 4
-rw-rw-r--. 1 mrzhang mrzhang 6 Jun 13 21:22 test2.log
[mrzhang@192 testmv2]$ 

更多例子可参考:Linux 移动或重命名文件/目录-mv 的10个实用例子

3. rm命令

  rm命令是用于删除文件或目录的命令。该命令可以删除一个目录中的一个或多个文件,也可也将目录下所有的文件都删除,而对于链接文件,只删除了链接,原有文件不变,而默认情况也就是不加参数的情况下,是只能删除文件的。
  以前我们在网上经常能看到一些rm命令的搞笑图,比如删库跑路之类的,可见该命令是一个比较危险的命令,我们使用该命令的时候,一定要注意下我们在哪个目录,要删除哪些东西,并且尽量不要使用该命令进行删除操作。

-I 当删除文件超过3个或删除目录时,给出一次确认删除提示信息,而-i是每删除一个文件展示一次提示信息
-f 强制删除,忽略掉不存在的文件,从不给出提示信息
-i 删除时提示确认信息
-d 删除时仅删除空目录
-r -R --recursive  rm删除时将参数中列出的全部目录和子目录均递归地删除
-v 删除时展示具体信息,即详细信息

同样,我们使用几个简单的例子来学习下该命令的使用:

    1. 删除文件时,弹出确认信息,并显示删除内容信息:
[mrzhang@192 testmv2]$ rm -vi test1.log 
rm: remove regular file ‘test1.log’? y
removed ‘test1.log’
[mrzhang@192 testmv2]$ 

我们还可以使用通配符来删除多个文件,比如要删除当前目录下所有log文件,并逐一弹出确认信息:

[mrzhang@192 testmv2]$ ll
total 12
-rw-rw-r--. 1 mrzhang mrzhang 5 Jun 13 21:51 test1.log
-rw-rw-r--. 1 mrzhang mrzhang 6 Jun 13 21:22 test2.log
-rw-rw-r--. 1 mrzhang mrzhang 4 Jun 13 21:51 test3.log
[mrzhang@192 testmv2]$ rm -i *.log
rm: remove regular file ‘test1.log’? y
rm: remove regular file ‘test2.log’? y
rm: remove regular file ‘test3.log’? n
[mrzhang@192 testmv2]$ ll
total 4
-rw-rw-r--. 1 mrzhang mrzhang 4 Jun 13 21:51 test3.log
    1. 递归删除当前目录下所有文件及目录,我们可以使用-r 参数来递归的删除所有文件,这个参数是个很危险的参数,一般情况下不建议使用,因为该参数会删除搜友文件及目录:
[mrzhang@192 testmv2]$ rm -r testmv22

-r-f参数组成的-rf 参数会强制删除目录下所有的文件及目录,并且没有任何提示信息,应该注意,尽量不要同时使用这两个参数。

    1. 删除文件时,如果文件不存在,默认rm命令会抛出与一个信息,我们可以使用-f 来忽略错误提示,从而强制执行:
[mrzhang@192 testmv3]$ ll
total 0
[mrzhang@192 testmv3]$ rm test1.log
rm: cannot remove ‘test1.log’: No such file or directory
[mrzhang@192 testmv3]$ rm -f test1.log
    1. 使用rm的 -I 参数,可以在删除超过 3 个文件或删除目录时提示一次确认信息:
[mrzhang@192 testmv]$ ll testmv3/
total 0
drwxrwxr-x. 3 mrzhang mrzhang 44 Jun 13 22:09 testmv31
drwxrwxr-x. 2 mrzhang mrzhang  6 Jun 13 22:09 testmv32
drwxrwxr-x. 2 mrzhang mrzhang  6 Jun 13 22:09 testmv33
drwxrwxr-x. 2 mrzhang mrzhang  6 Jun 13 22:09 testmv34
[mrzhang@192 testmv]$ rm -I testmv3/
rm: cannot remove ‘testmv3/’: Is a directory
[mrzhang@192 testmv]$ rm -Ir testmv3/
rm: remove 1 argument recursively? y
[mrzhang@192 testmv]$

本文参考自:https://linux.cn/article-9321-1.html

4. cal命令

cal (Calender缩写) 命令用来显示阳历日历,也就是公历日历,而默认情况下显示当前一个月的日历。我们来看一下它的常用参数:

Usage:
 cal [options]  [[[day]  month] year]

Options:
 -1, --one        show only current month (default)
 -3, --three      show previous, current and next month
 -s, --sunday     Sunday as first day of week
 -m, --monday     Monday as first day of week
 -j, --julian     一年的第几天(从1月1号开始算)
 -y, --year       show whole current year
 -V, --version    display version information and exit
 -h, --help       display this help text and exit

然后,接下来我们直接看例子就可以了:

[mrzhang@192 ~]$ cal 7 2015
      July 2015     
Su Mo Tu We Th Fr Sa
          1  2  3  4
 5  6  7  8  9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31

比如我们要查看整个2015年的日历:

[mrzhang@192 ~]$ cal 2015
                               2015                               

       January               February                 March       
Su Mo Tu We Th Fr Sa   Su Mo Tu We Th Fr Sa   Su Mo Tu We Th Fr Sa
             1  2  3    1  2  3  4  5  6  7    1  2  3  4  5  6  7
 4  5  6  7  8  9 10    8  9 10 11 12 13 14    8  9 10 11 12 13 14
11 12 13 14 15 16 17   15 16 17 18 19 20 21   15 16 17 18 19 20 21
18 19 20 21 22 23 24   22 23 24 25 26 27 28   22 23 24 25 26 27 28
25 26 27 28 29 30 31                          29 30 31

        July                  August                September     
Su Mo Tu We Th Fr Sa   Su Mo Tu We Th Fr Sa   Su Mo Tu We Th Fr Sa
          1  2  3  4                      1          1  2  3  4  5
 5  6  7  8  9 10 11    2  3  4  5  6  7  8    6  7  8  9 10 11 12
12 13 14 15 16 17 18    9 10 11 12 13 14 15   13 14 15 16 17 18 19
19 20 21 22 23 24 25   16 17 18 19 20 21 22   20 21 22 23 24 25 26
26 27 28 29 30 31      23 24 25 26 27 28 29   27 28 29 30

      October               November               December      
Su Mo Tu We Th Fr Sa   Su Mo Tu We Th Fr Sa   Su Mo Tu We Th Fr Sa
             1  2  3    1  2  3  4  5  6  7          1  2  3  4  5
 4  5  6  7  8  9 10    8  9 10 11 12 13 14    6  7  8  9 10 11 12
11 12 13 14 15 16 17   15 16 17 18 19 20 21   13 14 15 16 17 18 19
18 19 20 21 22 23 24   22 23 24 25 26 27 28   20 21 22 23 24 25 26
25 26 27 28 29 30 31   29 30                  27 28 29 30 31
5. date命令

date命令是Linux中与日期时间相关的命令,默认情况下,date命令会显示系统的日期和时间:

[mrzhang@192 ~]$ date
Fri Jun 22 22:30:45 CST 2018

我们来看一下date命令的格式:

Usage: date [OPTION] ... [+FORMAT]
  or:  date [-u|--utc|--universal] [MMDDhhmm[[CC] YY][.ss]]
Display the current time in the given FORMAT, or set the system date.

date命令有许多格式,如果我们不喜欢默认的格式,可以设置许多种格式。

5.1 多种日期格式

date命令提供了许多格式,这些格式通常都是以%开头,我们可以借助加号(+)来设置我们日期或时间的展示格式:

%H 小时(以00-23来表示)
%I 小时(以01-12来表示)
%K 小时(以0-23来表示)
%l 小时(以0-12来表示)
%M 分钟(以00-59来表示)�
%P AM或PM
%r 时间(含时分秒,小时以12小时AM/PM来表示)
%s 总秒数;起算时间为1970-01-01 00:00:00 UTC
%S 秒(以本地的惯用法来表示)
%T 时间(含时分秒,小时以24小时制来表示)
%X 时间(以本地的惯用法来表示)
%Z 时区;
%a 星期的缩写
%A 星期的完整名称
%b 月份英文名的缩写
%B 月份的完整英文名称
%c 日期与时间;只输入date指令也会显示同样的结果
%d 日期(以01-31来表示)
%D 日期(含年月日)
%j 该年中的第几天
%m 月份(以01-12来表示)
%U 该年中的周数
%w 该周的天数,0代表周日,1代表周一,异词类推
%x 日期(以本地的惯用法来表示)
%y 年份(以00-99来表示)
%Y 年份(以四位数来表示)
%n 在显示时,插入新的一行
%t 在显示时,插入tab
MM 月份(必要) 
DD 日期(必要) 
hh 小时(必要) 
mm 分钟(必要)
ss 秒(选择性) 

这里只展示了大部分的格式,如果我们有兴趣,通过date --help来了解更多命令,接下来我们来简单看下这些命令:

[mrzhang@192 ~]$ date +%d
22
[mrzhang@192 ~]$ date +%D
06/22/18
[mrzhang@192 ~]$ date +'%B %b'
June Jun
[mrzhang@192 ~]$ date +'Day:%d Month:%m Year:%Y'
Day:22 Month:06 Year:2018
5.2 RFC2822的日期与时间格式

通过-R 参数来使用RFC2822的格式输出:

[mrzhang@192 ~]$ date -R
Fri, 22 Jun 2018 22:33:54 +0800

RFC 2822 的格式是 : 星期, 日-月-年, 小时:分钟:秒 时区,时区 +0700 等同于 GMT +7。默认上date使用的是定义在/etc/localtime 的时区,有效时区数据定义在/usr/share/timezones

5.3 显示协调世界时UTC

我们可以使用 -u 参数来显示UTC:

[mrzhang@192 ~]$ date -u
Fri Jun 22 14:41:14 UTC 2018
5.4 设置系统日期和时间

一般情况下,我们系统的日期和时间是自动设置的,但如果由于一些原因,我们需要手动修改的话,那么我们就可以通过date的-s参数或者--set参数,两者的格式稍有不同:

[mrzhang@192 ~]$ date --set='20180612 23:00:00'
date: cannot set date: Operation not permitted
[mrzhang@192 ~]$ sudo date --set='20180612 23:00:00'
[sudo]  password for mrzhang: 

[mrzhang@192 ~]$ date
Tue Jun 12 23:00:05 CST 2018

[mrzhang@192 ~]$ sudo date -s 20180620
Wed Jun 20 00:00:00 CST 2018

需要注意的是,该命令需要root权限,如果没有权限,上面会提示出对应的错误信息。而设置时的日期格式也有多种方式:

date -s 20080523                #设置成20080523,这样会把具体时间设置成空00:00:00
date -s 01:01:01                #设置具体时间,不会对日期做更改
date -s “01:01:01 2008-05-23″   #这样可以设置全部时间
date -s “01:01:01 20080523″     #这样可以设置全部时间
date -s “2008-05-23 01:01:01″   #这样可以设置全部时间
date -s “20080523 01:01:01″     #这样可以设置全部时间
5.5 查看昨天,前天,上个月等日期

我们可以通过-d或者--date参数来展示:

date +%Y%m%d --date="+1 day"    #显示前一天的日期
date +%Y%m%d --date="-1 day"    #显示后一天的日期
date +%Y%m%d --date="-1 month"  #显示上一月的日期
date +%Y%m%d --date="+1 month"  #显示下一月的日期
date +%Y%m%d --date="-1 year"   #显示前一年的日期
date +%Y%m%d --date="+1 year"   #显示下一年的日期

看一些简单的例子:

[mrzhang@192 ~]$ date +%Y%m%d
20180620
[mrzhang@192 ~]$ date +%Y%m%d --d='-1 month'
20180520
[mrzhang@192 ~]$ date +%Y%m%d --d='-1 day'
20180619
[mrzhang@192 ~]$ date +%Y%m%d --d='+1 day'
20180621

date -d 的功能非常强大,通过将日期作为参数,我们可以快速地查明一个特定的日期。-d 参数还可以告诉您,相对于当前日期若干天的究竟是哪一天等强大的操作:

date -d "nov 22"             #今年的 11 月 22 日是星期三
date -d '2 weeks'            #2周后的日期
date -d '2 weeks 4 days'     #2周又过4天的日期
date -d 'next monday'        #下周一的日期
date -d 'next month'         #下个月的日期
date -d next-day +%Y%m%d     #明天的日期 或 date -d tomorrow +%Y%m%d
date -d last-day +%Y%m%d     #昨天的日期 或 date -d yesterday +%Y%m%d
date -d last-month +%Y%m     #上个月是几月
date -d next-month +%Y%m     #下个月是几月
date -d last-sunday                  #上周日的日期

使用 ago 指令,您可以得到过去的日期:
date -d '30 days ago'        #30天前的日期

使用负数以得到相反的日期:
date -d 'dec 14 -2 weeks'    #相对 dec 14 这个日期的两周前的日期
date -d '-100 days'          #100天以前的日期
date -d '50 days'            #50天后的日期

date还有一些参数,我们可以通过date --help或者man命令来进行学习。而一般情况下,我们进行备份或者定时任务的时候会用到相关日期,比如打印出日期等操作。

date命令参考自:
每天一个linux命令(37):date命令

6. whereis 命令

whereis命令可以查找指定命令的二进制文件、源代码文件和帮助文件,命令格式及参数为:

Usage:
 whereis [options]  file

Options:
 -b         搜索二进制文件
 -B <dirs>  指定搜索可执行文件的路径
 -m         搜索帮助文档
 -M <dirs>  指定索索帮助文档的路径
 -s         搜索源代码文件
 -S <dirs>  指定搜索源代码文件的路径
 -f         分割目录列表和要搜索的文件名
 -u         搜索默认路径下除可执行文件、源代码文件、帮助文件以外的其它文件
 -l         查看该命令的搜索路径
    1. 我们进行一些简单的查找:
[mrzhang@192 ~]$ whereis whereis
whereis: /usr/bin/whereis /usr/share/man/man1/whereis.1.gz
[mrzhang@192 ~]$ whereis svn
svn: /usr/bin/svn /usr/share/man/man1/svn.1.gz

其中展示的第一个路径就是我们要查询的路径,后面这个路径是对应帮助文档的位置。我们可以指定查找的时候只查找对应的类型:

[mrzhang@192 ~]$ whereis -b svn
svn: /usr/bin/svn
[mrzhang@192 ~]$ whereis -m svn
svn: /usr/share/man/man1/svn.1.gz
    1. 我们可以指定在某个具体的路径下进行搜索,同时可以指定多个路径,路径与要搜索的文件名之间使用-f 参数进行分割:
[mrzhang@192 ~]$ whereis -B /usr/bin cp
[mrzhang@192 ~]$ whereis -B /usr/bin -f cp
cp: /usr/share/man/man1/cp.1.gz /usr/share/man/man1p/cp.1p.gz /usr/bin/cp
    1. 查看whereis的搜索路径
[mrzhang@192 ~]$ whereis -l
bin: /usr/bin
bin: /usr/sbin
bin: /usr/lib
bin: /usr/lib64
bin: /etc
bin: /usr/etc
bin: /usr/games
bin: /usr/local/bin

  能实现类似功能的还有其他一些命令,比如find命令,但和find相比,whereis查找的速度显然更快,因为linux系统会将系统内所有的文件都记录在一个数据库文件中,当使用whereis进行查找时,会从数据库中查找数据,而不是像find命令那样,通过遍历硬盘来查找,效率自然会很高。

7. whatis命令

whatis命令用于查询一个命令执行什么功能,并将查询结果打印到终端上,相当于man -f 命令。默认情况下,只会展示查询到的命令的单行描述,不过可以使用参数-l来显示完整的描述。

[mrzhang@192 ~]$ whatis whereis
whereis (1)          - locate the binary, source, and manual page files for a...
[mrzhang@192 ~]$ whatis -l whereis
whereis (1)          - locate the binary, source, and manual page files for a command
8. locate命令

  locate命令和find命令类似,也是用于搜索文件或者目录的命令,locate命令其实算是find -name的另一种写法,但搜索效率比后者要快许多,因为它搜索的不是具体的目录,而是和whereis命令一样,在数据库中搜索(/var/lib/locatedb)。
  Linux系统自动创建这个数据库,并且每天自动更新一次,所以使用locate命令可能会查不到最新变动过的文件。为了避免这种情况,可以在使用locate之前,先使用updatedb命令,手动更新数据库。

Usage: locate [OPTION] ... [PATTERN] ...
Search for entries in a mlocate database.

  -A, --all              展示匹配全部
  -b, --basename         只匹配路径名的基本名称
  -c, --count            输出查询到的文件的数量 
  -d,--database DBPATH  设置查找的路径
  -e, --existing         只显示当前存在的文件
  -i, --ignore-case      忽略大小写
  -l, --limit, -n LIMIT  限制输出的行数
  -q, --quiet            安静模式,不展示任何错误信息
  -r, --regexp REGEXP    使用正则表达式进行查询
      --regex            patterns are extended regexps
  -w, --wholename        匹配整个路径名(默认)
8.1 查找etc目录下所有以sh开头的文件,文件数量,及限制展示条数
[mrzhang@192 ~]$ locate /etc/sh
/etc/shadow
/etc/shadow-
/etc/shells
[mrzhang@192 ~]$ locate -c /etc/sh
3
[mrzhang@192 ~]$ locate -n 2 /etc/sh
/etc/shadow
/etc/shadow-
[mrzhang@192 ~]$ locate -l 2 /etc/sh
/etc/shadow
/etc/shadow-
8.2 使用正则表达式进行查询:
[mrzhang@192 testcp1]$ locate -r test.log$
/home/mrzhang/Documents/testcp1/test.log
/home/mrzhang/Documents/testcp2/test.log
/home/mrzhang/Documents/testcp3/test.log
8.3 对于新创建文件,查询前先更新一下
[mrzhang@192 testcp1]$ updatedb
updatedb: can not open a temporary file for `/var/lib/mlocate/mlocate.db'
[mrzhang@192 testcp1]$ sudo updatedb
[sudo] password for mrzhang: 

如果遇到上述无法updatedb的情况,是权限问题,获取root权限进行更新。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,539评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,911评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,337评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,723评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,795评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,762评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,742评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,508评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,954评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,247评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,404评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,104评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,736评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,352评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,557评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,371评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,292评论 2 352

推荐阅读更多精彩内容