zoukankan      html  css  js  c++  java
  • Linux学习基础命令(三)


    find

    • 查找命令,可以根据类型查找文件
    • 用法:find [选项] [查找路径] [查找标准] [查找到以后的处理动作]
      • 选项:
        • -name filename 对文件名精确匹配,支持通配符
        • -iname filename 文件名匹配时不区分大小写
        • -user 查找某用户的所有文件
        • -group 查找某组的所有文件
        • -uid 根据UID进行查找
        • -gid 根据GID进行查找
        • -nouser 查找没有拥有者的文件
        • -nogroup 查找没有属组的文件
        • -type 根据文件类型进行查找
        • -size 根据文件大小进行查找。如1M、+10k、-10M
          • +表示大于,-表示小于,不加的表示等于
        • -mtime 根据修改时间查找
        • +5 表示查找5天以前修改的文件
        • -5 表示查找5天以内修改的文件
        • -atime 根据访问时间查找
        • -ctime 根据改变时间查找
        • -perm mode 根据权限精确查找
        • -perm –mode 文件权限能完全包含此mode时才符合条件
        • -perm /mode 9位权限中有任何一位权限匹配都视为符合查找条件
        • -print 打印到屏幕上
        • -ls 类似ls –l的形式显示每一个文件的详细信息
        • -delete 删除查找到的文件
        • -fls /path/to/somefile 将查找到的所有文件的长格式信息保存至指定文件中
        • -ok COMMAND {} ; 对查找到的所有文件执行某一个命令,每次操作都需要用户确认
        • -exec COMMAND {} ; 对查找到的所有文件执行某一个命令,操作不需要确认
        • -regex pattern 基于正则表达式进行文件名匹配
    [root@bad test]# find -name bad  //在当前目录下查找bad
    ./bad
    [root@bad test]# find /etc/ -name passwd  //在/etc/目录下查找passwd
    /etc/passwd
    /etc/pam.d/passwd
    [root@bad test]# find -iname a  /忽略大小写在当前目录下查找a
    ./a
    ./A
    [root@bad test]# find /home/ -user jay | head -3  //在/home目录下查找属于用户jay的文件,仅查看前三行
    /home/jay
    /home/jay/.mozilla
    /home/jay/.mozilla/extensions
    [root@bad test]# find /home/ -nouser  -exec rm -rf {} ;  //查找/home/目录下没有属主的文件,并且删除
    [root@bad test]# find /home/ -uid 1000  //在/home/目录下查找uid为1000的文件
    [root@bad test]# find /root/test/ -type f  //查找的类型是文件
    /root/test/5
    /root/test/6
    /root/test/7
    /root/test/8
    [root@bad test]# find /root/test/ -type d  //查找的类型是目录
    /root/test/
    /root/test/1
    /root/test/2
    /root/test/3
    /root/test/4
    [root@bad test]# find -size +1k  //在当前目录下查找大于1k的文件
    .
    ./anaconda-ks.cfg
    ./passwd
    [root@bad test]# find -size -1k  //在当前目录下查找小于1k的文件
    ./5
    ./6
    ./7
    [root@bad test]# find -mmin -5  //在当前目录下查找5分钟以内创建的文件
    [root@bad test]# find -mmin +10  //在当前目录下查找10分钟以前创建的文件
    [root@bad test]# ll
    total 12
    drwxr-xr-x. 2 root root    6 Nov  3 00:04 1
    drwxr-xr-x. 2 root root    6 Nov  3 00:04 2
    drwxr-xr-x. 2 root root    6 Nov  3 00:04 3
    drwxr-xr-x. 2 root root    6 Nov  3 00:04 4
    -rw-r--r--. 1 root root    0 Nov  3 00:10 5
    -rw-r--r--. 1 root root    0 Nov  3 00:10 6
    -rw-r--r--. 1 root root    0 Nov  3 00:10 7
    -rw-------. 1 root root 1196 Nov  3 00:08 anaconda-ks.cfg
    -rw-r--r--. 1 root root  293 Nov  3 00:08 ifcfg-eno16777736
    -rw-r--r--. 1 root root 1905 Nov  3 00:08 passwd
    [root@bad test]# find -perm 644  //在当前目录下查找权限为644的文件
    ./passwd
    ./ifcfg-eno16777736
    ./5
    ./6
    ./7
    [root@bad test]# find -perm 644 -type f  //在当前目录下查找权限为644且类型为文件
    [root@bad test]# find -type f -perm 644 -ls  //在当前目录下查找权限为644的文件并列出
    71511020    4 -rw-r--r--   1 root     root         1905 Nov  3 00:08 ./passwd
    71511021    4 -rw-r--r--   1 root     root          293 Nov  3 00:08 ./ifcfg-eno16777736
    71511012    0 -rw-r--r--   1 root     root            0 Nov  3 00:10 ./5
    71511015    0 -rw-r--r--   1 root     root            0 Nov  3 00:10 ./6
    71511016    0 -rw-r--r--   1 root     root            0 Nov  3 00:10 ./7
    [root@bad test]# find -type f -perm 644 -delete  //在当前目录下查找权限为644的文件并删除
    [root@bad test]# ls
    1  2  3  4  anaconda-ks.cfg
    [root@bad test]# find -type d -ok rm -rf {} ;  //在当前目录下查找类型为目录的文件,并删除,提示用户确认
    < rm ... . > ? y
    rm: refusing to remove ‘.’ or ‘..’ directory: skipping ‘.’
    < rm ... ./1 > ? y
    find: ‘./1’: No such file or directory
    < rm ... ./2 > ? y
    find: ‘./2’: No such file or directory
    < rm ... ./3 > ? y
    find: ‘./3’: No such file or directory
    < rm ... ./4 > ? y
    find: ‘./4’: No such file or directory
    [root@bad test]# ls
    anaconda-ks.cfg
    [root@bad test]# ls
    1  2  3  4  anaconda-ks.cfg
    [root@bad test]# find -type d -exec rm -rf {} ;  //在当前目录下查找类型为目录的文件,并删除,不提示用户确认
    rm: refusing to remove ‘.’ or ‘..’ directory: skipping ‘.’
    find: ‘./1’: No such file or directory
    find: ‘./2’: No such file or directory
    find: ‘./3’: No such file or directory
    find: ‘./4’: No such file or directory
    [root@bad test]# ls
    anaconda-ks.cfg
    [root@bad test]# find -type f | xargs rm -rf  //在当前目录下查找类型为普通文件,并删除;不能用于文件过多的删除
    

    在使用ls命令时,我们所看到的详细信息中,第一个字符就代表着文件类型,-表示的是文件。

    • f 普通文件
    • d 目录
    • s 套接字
    • l 链接文件
    • b 块设备
    • c 字符设备

    grep

    • 过滤
    • 用法:grep [选项]
      • 选项:
      • -i 忽略大小写
      • -v 显示没有被正则表达式匹配到的内容
      • -o 只显示被正则表达式匹配到的内容
      • -E 使用扩展正则表达式
      • -q 静默模式,不输出任何信息
      • -A # 此处的#必须是数字。被正则匹配到的内容以及其后面#行的内容都显示出来
      • -B # 此处的#必须是数字。被正则匹配到的内容以及其前面#行的内容都显示出来
      • -C # 此处的#必须是数字。被正则匹配到的内容及其前后各#行的内容都显示出来
    [root@bad test]# ls
    abc  Abc  ABC  passwd  bad
    [root@bad test]# ls | grep abc
    abc
    [root@bad test]# ls | grep Abc
    Abc
    [root@bad test]# ls | grep '[aA]bc'
    abc
    Abc
    [root@bad test]# ls | grep 'abc'
    abc
    [root@bad test]# ls | grep -i 'abc'  //过滤忽略大小写的abc
    abc
    Abc
    ABC
    [root@bad test]# ls | grep '^abc$'
    abc
    [root@bad test]# ls | grep -E '(a|A)bc'
    abc
    Abc
    abcd
    [root@bad test]# ls | grep -E '^(a|A)bc$'
    abc
    Abc
    [root@bad test]# ls | grep '(a|A)bc'
    abc
    Abc
    abcd
    t@bad test]# head -5 passwd 
    bad:x:0:0:bad:/bad:/bin/bash
    bin:x:1:1:bin:/bin:/sbin/nologin
    daemon:x:2:2:daemon:/sbin:/sbin/nologin
    adm:x:3:4:adm:/var/adm:/sbin/nologin
    lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
    [root@bad test]# grep '^daemon' passwd  //过滤出以daemon开头的行
    daemon:x:2:2:daemon:/sbin:/sbin/nologin
    [root@bad test]# grep -A2 '^daemon' passwd  //过滤出以daemon开头的行的后两行和本身
    daemon:x:2:2:daemon:/sbin:/sbin/nologin
    adm:x:3:4:adm:/var/adm:/sbin/nologin
    lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
    [root@bad test]# grep -B1 '^daemon' passwd  //过滤出以daemon开头的行的前一行和本身
    bin:x:1:1:bin:/bin:/sbin/nologin
    daemon:x:2:2:daemon:/sbin:/sbin/nologin
    [root@bad test]# grep -C1 '^daemon' passwd  //过滤出以daemon开头的行的前一行后一行和本身
    bin:x:1:1:bin:/bin:/sbin/nologin
    daemon:x:2:2:daemon:/sbin:/sbin/nologin
    adm:x:3:4:adm:/var/adm:/sbin/nologin
    [root@bad test]# ls | grep '^a.c$'  //过滤出a_c的文件
    abc
    [root@bad test]# ls | grep '^[0-9]$'  //过滤出0-9的文件
    1
    2
    3
    4
    5
    6
    7
    8
    9
    [root@bad test]# ls | grep '^1*$'  //过滤出*号前的字符出现任意次的文件
    1
    11
    111
    1111
    [root@bad test]# ls | grep '^1.*$'  //.表示任意单个字符,*表示前面一个字符的任意次
    1
    10
    11
    111
    1111
    12
    13
    14
    15
    16
    17
    18
    19
    
    
    [root@bad test]# ls | grep '^1+$'  //匹配前字符的任意次数,作用与*相同
    1
    11
    111
    1111
    [root@bad test]# ls | grep '^1{3}$'  //匹配1出现3次的文件
    111
    [root@bad test]# ls | grep '^1{1,3}$'  //匹配1出现至少一次至多三次的所有文件
    1
    11
    111
    [root@bad test]# ls | grep '^1{1,}$'  //匹配1出现至少一次,至多无限次的文件
    1
    11
    111
    1111
    [root@bad test]# ls | grep '^1{0,1}$'  //匹配1出现至少次,至多1次的文件
    1
    [root@bad test]# 
    
    • findgrep是两个比较重要的命令,同时他们的选项也会很多,所以需要多用,熟悉每个命令的作用

    通配符

    有时候我们存储的文件太多了,就不知道自己的东西存在哪里了。只依稀记得是以A开头的PDF文件,那我们要怎么去找呢?这个时候我们就可以用到通配符,帮助我们快速的找到文件了。在Windows中有款软件叫Everything(绝对好用!比Windows自带的搜索快很多倍!),是一款能够快速帮你找到文件的软件,它同样也支持通配符的使用。

    • 文件名通配
      • * 匹配任意长度的任意字符
      • 匹配任意的单个字符
      • [] 匹配指定范围内的任意单个字符
        • [abc],[a-m],[0-9]
    [root@bad test]# ls
    a  aac  aad  ab  abc  abd  ac  adc  bc  be
    [root@bad test]# ls a*  //列出当前目录下所有的以a开头的文件
    a  aac  aad  ab  abc  abd  ac  adc
    [root@bad test]# ls b*  //列出当前目录下所有的以b开头的文件
    bc  be
    [root@bad test]# ls a?c  //列出名为a_c格式的文件
    aac  abc  adc
    [root@bad test]# 
    
    • 以上是常用的三种通配符,当然还有很多其他的通配符

      • [[:space:]] 表示空白字符
      • [[:punct:]] 表示标点符号
      • [[:lower:]] 表示小写字母
      • [[:upper:]] 表示大写字母
      • [[:alpha:]] 表示大小写字母
      • [[:digit:]] 表示数字
      • [[:alnum:]] 表示数字和大小写字母
      • [^] 匹配指定范围之外的任意单个字符
    [root@bad test]# touch {a..z}  //创建a-z的文件
    [root@bad test]# ls
    a  b  c  d  e  f  g  h  i  j  k  l  m  n  o  p  q  r  s  t  u  v  w  x  y  z
    [root@bad test]# touch {A..Z}  //创建A-Z的文件
    [root@bad test]# ls
    a  b  c  d  e  f  g  h  i  j  k  l  m  n  o  p  q  r  s  t  u  v  w  x  y  z
    A  B  C  D  E  F  G  H  I  J  K  L  M  N  O  P  Q  R  S  T  U  V  W  X  Y  Z
    [root@bad test]# ls [a-z]  //列出a-z文件
    a  b  c  d  e  f  g  h  i  j  k  l  m  n  o  p  q  r  s  t  u  v  w  x  y  z
    A  B  C  D  E  F  G  H  I  J  K  L  M  N  O  P  Q  R  S  T  U  V  W  X  Y
    [root@bad test]# ls [^a-z]  //列出除了a-z的文件,即取反
    Z
    [root@bad test]#
    

    重定向与管道

    说真的,我在学习这里的时候,是真的迷。感觉很高大上,但奈何自己就是掌握不好,好在经常联系,反复的看相关的资料,最后也算基本掌握。

    • 系统设定:
      * 标准输入 STDIN 用数字0来表示
      * 标准输出 STDOUT 用数字1来表示
      * 标准错误输出 STDERR 用数字2来表示
    • 这里还记得我们之前使用过的echo $?吗?判断上一条命令执行结果是否正确,0表示正确的,其他的数字都表示上一条命令有错误。

    I/O重定向

    重定向在前面我们也有了解到过,就是使用echo将一段文本内容追加或是覆盖到某一文件中,就使用到了简单的重定向。

    • > 覆盖输出
    • >> 追加输出
    • 2> 重定向错误输出
    • 2>> 追加重定向错误输出
    • &> 覆盖重定向标准输出或错误输出至同一个文件
    • &>> 追加重定向标准输出或错误输出至同一个文件
    • < 输入重定向
    [root@bad test]# echo "a b c" > bad  //将a b c追加到文件bad中,覆盖
    [root@bad test]# cat bad  //查看文件bad中的文件
    a b c
    [root@bad test]# echo "1" >> bad  //将1追加到文件bad中,不覆盖
    [root@bad test]# echo "2" >> bad  //将2追加到文件bad中,不覆盖
    [root@bad test]# echo "3" >> bad  //将3追加到文件bad中,不覆盖
    [root@bad test]# cat bad  //查看文件bad中的文件
    a b c
    1
    2
    3
    
    • << Here Document
    [root@bad test]# cat > bad <<EOF  //直接在屏幕输入写入文件bad中的内容,EOF保存
    > a
    > b
    > c
    > 1
    > 2
    > EOF
    [root@bad test]# cat bad  //查看文件bad中的文件
    a
    b
    c
    1
    2
    
    • 最后这种也是我们经常会用到的一种,当文件内容太多,我们不想打开编辑,一句一句的写入又太麻烦,就可以使用这种方法。

    管道

    • 将前一个命令的输出作为后一个命令的输入。最后一个命令会在当前shell进程的子shell进程中执行
      • 用法:命令1 | 命令2 | 命令3 | …
    [root@bad test]# cat anaconda-ks.cfg | wc -l  //统计文件anaconda-ks.cfg的行数
    47
    [root@bad test]# cat anaconda-ks.cfg | wc -c  //统计文件anaconda-ks.cfg的单词数
    1196
    [root@bad test]# cat anaconda-ks.cfg | wc -w  //统计文件anaconda-ks.cfg的字节数
    103
    [root@bad test]#
    
    • tee 从标准输入读取数据,输出一份到屏幕上,一份保存到文件
    [root@localhost ~]# echo "hello world" | tee /tmp/hello.out
    hello world
    [root@localhost ~]# cat /tmp/hello.out
    hello world
    
    • 在这里管道符|的前后要不要加空格看个人习惯,我习惯加空格,因为这样看起来更好看

    引号的引用

    引号的引用跟我们学习的很多编程语言里面的是一样的,这点不难。学到这里的时候,我才第一次知道 ` 这个叫反引号,是用Esc下面的按键打出来的。

    • `` 反引号,键盘左上角Esc下面的键,用于命令替换
    • "" 双引号,弱引用,可以实现变量替换
    • '' 单引号,强引用,不完成变量替换
    [root@bad test]# a=5
    [root@bad test]# echo "$a"
    5
    [root@bad test]# echo '$a'
    $a
    [root@bad test]# echo $a
    5
    [root@bad test]# 
    
    • `` =$( ) 反引号语句当作命令执行一遍,再将结果加入到原命令中重新执行;
    [root@bad test]# ls bad
    1  2  3
    [root@bad test]# a=`ls bad`
    [root@bad test]# echo $a
    1 2 3
    [root@bad test]# echo `ls bad`
    1 2 3
    [root@bad test]# echo $(ls bad)
    1 2 3
    [root@bad test]#
    

    获取命令帮助

    当然,Linux可以说是一个纯命令的操作系统,那么问题就来了,那么多的命令,我怎么能清楚的记得每一个命令的用法呢?那万一我只记得命令,但是急不得它有什么用,或者说是怎么用的,那怎么办呢?这个时候我们就需要获取命令帮助了。

    help、man

    前面讲到过,在查看命令是内部命令还是外部命令使用type这条命令。

    • 内部命令
      • 用法:help COMMAND
    • 外部命令
      • 用法:COMMAND --help
    • 命令手册
      • 用法:man COMMAND

    man是分章节的,以下是每一章节的内容介绍:

    1   用户命令(/bin,/usr/bin,/usr/local/bin)
    2   系统调用
    3   库调用
    4   特殊文件(设备文件)
    5   文件格式(配置文件 的语法)
    6   游戏
    7   杂项(Miscellaneous)
    8   管理命令(/sbin,/usr/sbin,/usr/local/sbin)
    
    • man手册注意事项:
      • [] 可选
      • <> 必选
      • ... 可以出现多次
      • | 多选一
      • {} 分组
      • NAME 命令名称及功能简要说明
      • SYNOPSIS 用法说明,包括可用的选项
      • DESCRIPTION 命令功能的详尽说明,可能包括每一个选项的意思
      • OPTIONS 说明每一个选项的意义
      • FILES 此命令相关的配置文件
      • BUGS 报告bug
      • EXAMPLES 使用示例
      • SEE ALSO 另外参照

    那么问题来了,进入man手册之后,我们要怎么查阅,怎么翻页怎么退出呢?

    • man翻屏

      • 向后翻一屏 SPACE,也就是空格
      • 向前翻一屏 B
      • 向后翻一行 Enter,回车
      • 向前翻一行 K
    • 查找

      • /KEYWORD 向后查找KEYWORD
      • ?KEYWORD 向前查找KEYWORD
      • n 下一个
      • N 前一个
      • q 退出

    组合键

    • Ctrl+A 光标跳转至正在输入的命令行的首部
    • Ctrl+E 光标跳转至正在输入的命令行的尾部
    • Ctrl+W 删除光标之前的单词
    • Ctrl+K 删除从光标到末行的所有字符
    • Ctrl+U 删除从光标到首行的所有字符
    • Ctrl+← 光标跳转到前一个单词词首
    • Ctrl+→ 光标跳转到后一个单词词尾
    • Ctrl+L 清屏,和clear命令等效
    • Ctrl+C 终止前台运行的程序
    • Ctrl+Z 将任务暂停,挂至后台
    • Ctrl+D 在shell中,Ctrl-d表示退出当前shell
    • Ctrl+R 搜索历史命令,利用关键字

    在Linux中,使用ping命令时,不会像Windows中一样会自己停下来,必须要使用Ctrl+C终止ping命令。

    如果有错误或不详尽的地方,还请留言指出。
    
    本文作者: 坏坏
  • 相关阅读:
    [译] 关于CSS中的float和position
    【规范】前端编码规范——注释规范
    【规范】前端编码规范——jquery 规范
    【规范】前端编码规范——javascript 规范
    【规范】javascript 变量命名规则
    如何使用TestFlight进行Beta测试
    i o s 崩溃日志分析
    CocoaPods安装和使用教程
    iOS 程序切换后台
    iOS 百度地图获取当前地理位置
  • 原文地址:https://www.cnblogs.com/bad5/p/12424299.html
Copyright © 2011-2022 走看看