美文网首页
文件名通配globbing内容及演示

文件名通配globbing内容及演示

作者: 香吉矢 | 来源:发表于2017-08-23 21:45 被阅读0次
    globbing
    • 概述
      globbing是bash常见特性之一;Bash通过globbing来执行文件名的扩展;globbing不会使用标准的RE集(标准正则表达式),通过识别和扩展通配符来完成匹配文件名(整个文件名匹配,非部分),即元字符;globbing在解释元字符有重要的限制,且有些元字符意义和RE集里的不相同。
    • globbing中使用的元字符及意义
    1. *:匹配任意长度的任意字符
    2. ?:匹配任意单个字符
    3. []:匹配指定范围内的任意单个字符
      - 几种常见的特殊格式
      [a-z]或[A-Z]:所有字母,不区分大小写
      [0-9]:所有的数字
      [a-z0-9] :所有字母和数字
      [[:upper:]]:所有大写字母,外侧中括号表示范围的,内层中括号是固定格式
      [[:lower:]]:所有小写字母
      [[:alpha:]]:所有字母
      [[:digit:]]:所有数字
      [[:alnum:]]:所有字母和数字
      [[:space:]]:所有空白字符
      [[:punct:]]:所有标点符号
    4. [^]:匹配指定范围外的任意单个字符
    • 演示
      显示/var目录下所有以l开头,以一个小写字母结尾,且中间出现一位任意字符的文件或目录本身
      [root@localhost ~]# ll /var     \\查看目录下符合条件的文件名称,加粗部分(lib和log目录)
      总用量 12
      drwxr-xr-x. 2 root root 19 7月 13 23:38 account
      drwxr-xr-x. 2 root root 6 11月 5 2016 adm
      drwxr-xr-x. 13 root root 159 7月 22 22:27 cache
      drwxr-xr-x. 2 root root 6 11月 7 2016 crash
      drwxr-xr-x. 3 root root 34 5月 30 06:34 db
      drwxr-xr-x. 3 root root 18 5月 30 06:34 empty
      drwxr-xr-x. 2 root root 6 11月 5 2016 games
      drwxr-xr-x. 2 root root 6 11月 5 2016 gopher
      drwxr-xr-x. 3 root root 18 5月 30 06:32 kerberos
      drwxr-xr-x. 52 root root 4096 7月 22 22:37 lib
      drwxr-xr-x. 2 root root 6 11月 5 2016 local
      lrwxrwxrwx. 1 root root 11 5月 30 06:31 lock -> ../run/lock
      drwxr-xr-x. 17 root root 4096 7月 23 00:01 log
      lrwxrwxrwx. 1 root root 10 5月 30 06:31 mail -> spool/mail
      drwxr-xr-x. 2 root root 6 11月 5 2016 nis
      drwxr-xr-x. 2 root root 6 11月 5 2016 opt
      drwxr-xr-x. 2 root root 6 11月 5 2016 preserve
      lrwxrwxrwx. 1 root root 6 5月 30 06:31 run -> ../run
      drwxr-xr-x. 12 root root 140 7月 13 23:37 spool
      drwxrwxrwt. 7 root root 4096 7月 22 22:52 tmp
      drwxr-xr-x. 2 root root 6 11月 5 2016 y
      [root@localhost ~]# ls /var/l?[[:lower:]]
      /var/lib:
      AccountsService bluetooth .....
       
      /var/log:
      anaconda cron .....
      [root@localhost ~]# ls -d /var/l?[[:lower:]]     \\加-d选项,只显示文件或目录本身
      /var/lib /var/log
      [root@localhost ~]# touch /var/ldy     \/var下没有符合条件的文件,创建文件,进行匹配演示
      [root@localhost ~]# touch /var/ldw     \/var下没有符合条件的文件,创建文件,进行匹配演示
      [root@localhost ~]# ls /var
      account adm cache crash db empty games gopher kerberos ldw ldy lib local lock log mail nis opt preserve run spool tmp yp
      [root@localhost ~]# ls -d /var/l?[[:lower:]]     \\加-d选项,只显示文件或目录(不显示其下的内容)
      /var/ldw /var/ldy /var/lib /var/log
      [root@localhost ~]# ls -dl /var/l?[[:lower:]]
      -rw-r--r--. 1 root root 0 7月 23 11:00 /var/ldw
      -rw-r--r--. 1 root root 0 7月 23 11:00 /var/ldy
      drwxr-xr-x. 52 root root 4096 7月 22 22:37 /var/lib
      drwxr-xr-x. 17 root root 4096 7月 23 00:01 /var/log
      [root@localhost ~]# ls -l /var/l?[[:lower:]]
      -rw-r--r--. 1 root root 0 7月 23 11:00 /var/ldw
      -rw-r--r--. 1 root root 0 7月 23 11:00 /var/ldy
       
      /var/lib:
      总用量 0
      drwxr-xr-x. 4 root root 32 7月 13 23:30 AccountsService
      drwxr-xr-x. 2 root root 26 7月 22 22:35 alsa
      .......
       
      /var/log:
      总用量 14716
      drwxr-xr-x. 2 root root 176 5月 30 06:41 anaconda
      drwx------. 2 root root 23 5月 30 06:49 audit
      ......
      [root@localhost ~]#

    显示/etc目录下,以任意一位数字开头,且非数字结尾的文件或目录
    [root@localhost mytest]# ls etc     \/etc目录下没有符合的文件,故在/tmp/mytest/etc下随便创建如下文件,进行演示
    1xq1 2xq2 3xqs 44xqs 5xq. 6xl xqr
    [root@localhost mytest]# ls etc/[[:digit:]][^[:digit:]]
    etc/3xqs etc/44xqs etc/5xq. etc/6xl
    [root@localhost mytest]# ls etc/[0-9]
    [^0-9]     \\etc下全是文件就不用-d选项了
    etc/3xqs etc/44xqs etc/5xq. etc/6xl


    显示/etc目录下,以非字母开头,后边跟一个字母及其它任意长度字符的文件或目录
    [root@localhost etc]# ls
    12dy 1d12 1Dy12 dy1 m3plus
    [root@localhost etc]# ls [^a-z][a-z]*
    1d12 1Dy12
    [root@localhost etc]# ls [^[:alpha:]][[:alpha:]]*
    1d12 1Dy12
    [root@localhost etc]#


    复制/etc/目录下,所有以m开头,以非数字结尾的文件或目录至/tmp/mg目录
    [root@localhost mytest]# ls etc     \\加粗的两个文件,不是目录
    1x9d 2xq2 44xqs 4X5ds 5xq. 6xl @d8sd mi1 mi2 mi2plus mi3plus+ xqr
    [root@localhost mytest]# mkdir /tmp/mg
    [root@localhost mytest]# cp -vr etc/m[^0-9] /tmp/mg     \\多源复制需要确保mg是目录且存在
    "etc/mi2plus" -> "/tmp/mg/mi2plus"
    "etc/mi3plus+" -> "/tmp/mg/mi3plus+"
    [root@localhost mytest]# ls /tmp/mg
    mi2plus mi3plus+
    [root@localhost mytest]# mkdir etc/m3plus     \\新建目录,测试使用
    [root@localhost mytest]# ls etc
    1x9d 2xq2 44xqs 4X5ds 5xq. 6xl @d8sd m3plus mi1 mi2 mi2plus mi3plus+ xqr
    [root@localhost mytest]# cp etc/{mi1,mi2} etc/m3plus/     \\多源复制需要确保m3plus是目录且存在
    [root@localhost mytest]# ls etc/m
    [^-9]
    etc/mi1 etc/mi2 etc/mi2plus etc/mi3plus+
     
    etc/m3plus:
    mi1 mi2
    [root@localhost mytest]# cp -v etc/m[^0-9] /tmp/mg     \\没有-r选项,虽然匹配了目录,但m3plus复制失败
    cp: 略过目录"etc/m3plus"
    "etc/mi2plus" -> "/tmp/mg/mi2plus"
    "etc/mi3plus+" -> "/tmp/mg/mi3plus+"
    [root@localhost mytest]# ls /tmp/mg
    mi2plus mi3plus+
    [root@localhost mytest]# !rm     \\history命令历史用法,直接调用历史命令并执行
    rm /tmp/mg/m

    rm:是否删除普通空文件 "/tmp/mg/mi2plus"?yes
    rm:是否删除普通空文件 "/tmp/mg/mi3plus+"?yes
    [root@localhost mytest]# cp -vr etc/m[^0-9] /tmp/mg     \-r选项,复制目录命令成功
    "etc/m3plus" -> "/tmp/mg/m3plus"
    "etc/m3plus/mi1" -> "/tmp/mg/m3plus/mi1"
    "etc/m3plus/mi2" -> "/tmp/mg/m3plus/mi2"
    "etc/mi2plus" -> "/tmp/mg/mi2plus"
    "etc/mi3plus+" -> "/tmp/mg/mi3plus+"
    [root@localhost mytest]# ls /tmp/mg
    m3plus mi2plus mi3plus+
    [root@localhost mytest]# tree /tmp/mg
    /tmp/mg
    ├── m3plus
    │ ├── mi1
    │ └── mi2
    ├── mi2plus
    └── mi3plus+
     
    1 directory, 4 files
    [root@localhost mytest]# ls /tmp/mg/m
    [^-9]
    /tmp/mg/mi2plus /tmp/mg/mi3plus+
     
    /tmp/mg/m3plus:
    mi1 mi2
    [root@localhost mytest]# ls -d /tmp/mg/m*[^-9]
    /tmp/mg/m3plus /tmp/mg/mi2plus /tmp/mg/mi3plus+
    [root@localhost mytest]#


    复制/usr/share/man目录下,所有以man开头,后跟一个数字结尾的文件或目录/tmp/man/目录下
    [root@localhost mytest]# ls -d /usr/share/man/man*[0-9]   \\本次就只匹配出来,不进行复制操作了
    /usr/share/man/man1 /usr/share/man/man4 /usr/share/man/man7
    /usr/share/man/man2 /usr/share/man/man5 /usr/share/man/man8
    /usr/share/man/man3 /usr/share/man/man6 /usr/share/man/man9
    [root@localhost mytest]#


    复制/etc目录下,所有以.conf结尾,且以m,n,r,p开头的文件或目录至/tmp/conf.d/目录下
    [root@localhost mytest]# ls /etc/[mnrp]*.conf   \\本次就只匹配出来,不进行复制操作了
    /etc/man_db.conf /etc/nsswitch.conf /etc/radvd.conf /etc/rsyslog.conf
    /etc/mke2fs.conf /etc/numad.conf /etc/request-key.conf
    /etc/mtools.conf /etc/pbm2ppa.conf /etc/resolv.conf
    /etc/nfsmount.conf /etc/pnm2ppa.conf /etc/rsyncd.conf

    相关文章

      网友评论

          本文标题:文件名通配globbing内容及演示

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