美文网首页
Linux命令学习(二)

Linux命令学习(二)

作者: 骑着乌龟去看海 | 来源:发表于2018-06-11 22:40 被阅读16次
    前言

    接上文,本文接着来学习Linux的命令。

    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
    
    日历命令的一些参数使用.png

    比如我们要查看整个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权限进行更新。

    相关文章

      网友评论

          本文标题:Linux命令学习(二)

          本文链接:https://www.haomeiwen.com/subject/jxekeftx.html