Linux shell 通配符

时间:2019-04-29 03:17:26  来源:igfitidea点击:

Shell扩展 - 通配符-模式匹配

在使用linux的过程中,你会非常方便地基本了解通配符,模式匹配和扩展技术。这些缩写功能非常强大,可以节省大量时间。

例如,如果我们需要创建全部以名称section开头,然后以数字开头的多个目录,则可以执行命令:

mkdir section01 section02 section03 section04。 

可以想象,如果要创建很多东西,这将非常耗时。但是,我们可以通过执行以下命令来节省大量时间:
mkdir section {01..10}

john@john-desktop:~/test_examples$ ls -l
total 0
john@john-desktop:~/test_examples$ mkdir section{01..10}
john@john-desktop:~/test_examples$ ls -l
total 40
drwxrwxr-x 2 john john 4096 Jan 20 13:44 section01
drwxrwxr-x 2 john john 4096 Jan 20 13:44 section02
drwxrwxr-x 2 john john 4096 Jan 20 13:44 section03
drwxrwxr-x 2 john john 4096 Jan 20 13:44 section04
drwxrwxr-x 2 john john 4096 Jan 20 13:44 section05
drwxrwxr-x 2 john john 4096 Jan 20 13:44 section06
drwxrwxr-x 2 john john 4096 Jan 20 13:44 section07
drwxrwxr-x 2 john john 4096 Jan 20 13:44 section08
drwxrwxr-x 2 john john 4096 Jan 20 13:44 section09
drwxrwxr-x 2 john john 4096 Jan 20 13:44 section10
john@john-desktop:~/test_examples$ rmdir section*
john@john-desktop:~/test_examples$ ls -l
total 0

从上面的示例可以看出,命令行非常强大。一个简单的命令创建了十个目录,然后一个命令删除了所有与section *模式匹配的十个目录。

通配符 Wildcards 和Globbing

随着你越来越多地使用Linux,经常会遇到需要对多个文件系统对象执行操作的场景。如前所述,如果必须指定每个文件系统对象,则可能会非常耗时。幸好,Linux具有内置的通配符支持,通常也称为Globbing

例如,假设你有多个文件,分别称为test01,test02,test03,test04和test05,则可以将通配符模式与rm命令结合使用以删除这些文件。

john@john-desktop:~/test_examples$ touch file{1..5}
john@john-desktop:~/test_examples$ ls -l
total 0
-rw-rw-r-- 1 john john 0 Jan 20 14:14 file1
-rw-rw-r-- 1 john john 0 Jan 20 14:14 file2
-rw-rw-r-- 1 john john 0 Jan 20 14:14 file3
-rw-rw-r-- 1 john john 0 Jan 20 14:14 file4
-rw-rw-r-- 1 john john 0 Jan 20 14:14 file5
john@john-desktop:~/test_examples$ rm file[1-5]
john@john-desktop:~/test_examples$ ls -l
total 0
john@john-desktop:~/test_examples$ touch file{1..5}
john@john-desktop:~/test_examples$ ls -l
total 0
-rw-rw-r-- 1 john john 0 Jan 20 14:14 file1
-rw-rw-r-- 1 john john 0 Jan 20 14:14 file2
-rw-rw-r-- 1 john john 0 Jan 20 14:14 file3
-rw-rw-r-- 1 john john 0 Jan 20 14:14 file4
-rw-rw-r-- 1 john john 0 Jan 20 14:14 file5
john@john-desktop:~/test_examples$ rm file*
john@john-desktop:~/test_examples$ ls -l
total 0

如你在上面的示例中看到的,与模式file [1-5]file *匹配的所有文件均被删除。在上面的示例中,file [1-5]将匹配以file开头并以1、2、3、4或5结尾的任何文件。但是,模式file *将匹配以名称file开头的所有文件。 *通配符选项匹配任何字符,甚至无字符

我们还可以通过在ls命令中添加一个模式来列出特定的文件系统对象:ls -d /etc/pa *。你可以添加到模式来过滤掉更多的结果:

在第一个示例中,将返回任何包含 /etc/pa的文件系统对象。在修改后的示例中,我们修改了模式,使其仅包含包含模式/etc/pap的文件系统对象。

john@john-desktop:~$ ls -d /etc/pa*
/etc/pam.conf  /etc/pam.d  /etc/papersize  /etc/passwd  /etc/passwd-
john@john-desktop:~$ ls -d /etc/pap*
/etc/papersize

需要注意的重要一件事是,如果你使用模式匹配而没有任何模式匹配,则会收到错误消息。消息通常是这样的格式: No such file or directory.

john@john-desktop:~$ ls -d /etc/john*
ls: cannot access /etc/john*: No such file or directory

通配符扩展-*特殊字符

使用 * 进行匹配

一个*将匹配零个或多个字符。

/etc/p*将匹配/etc中以p开头的所有文件,或者是一个单独称为p的文件

/home/itr/wi*1匹配/home/itr目录中以wi开头、以1结尾的任何文件

$ ls -l w*
-rw-rw-r-- 1 itr itr 0 Jan 20 21:12 wi1
-rw-rw-r-- 1 itr itr 0 Jan 20 21:12 wilcard
-rw-rw-r-- 1 itr itr 0 Jan 20 21:12 wildcard1
-rw-rw-r-- 1 itr itr 0 Jan 20 21:13 wildcard2
$ ls -l wi*1
-rw-rw-r-- 1 itr itr 0 Jan 20 21:12 wi1
-rw-rw-r-- 1 itr itr 0 Jan 20 21:12 wildcard1
$ ls -l wi*2
-rw-rw-r-- 1 itr itr 0 Jan 20 21:13 wildcard2

使用 ? 进行匹配

一个?将匹配任何单个字符。

/home/itr /通配符?将匹配名称由通配符后跟单个字符组成的任何文件

$ ls -l w*

-rw-rw-r-- 1 itr itr 0 Jan 20 21:12 wi1
-rw-rw-r-- 1 itr itr 0 Jan 20 21:12 wilcard
-rw-rw-r-- 1 itr itr 0 Jan 20 21:12 wildcard1
-rw-rw-r-- 1 itr itr 0 Jan 20 21:13 wildcard2
$ ls -l wildcard?
-rw-rw-r-- 1 itr itr 0 Jan 20 21:12 wildcard1
-rw-rw-r-- 1 itr itr 0 Jan 20 21:13 wildcard2

使用[]进行匹配

要使用此通配符,只需将要匹配的字符放在方括号[]内。你也可以在方括号之间添加破折号-以指定范围或范围的组合。
wildcard [12]将匹配文件wildcard1和wildcard2

$ ls -l wildcard[12]

-rw-rw-r-- 1 itr itr 0 Jan 20 21:12 wildcard1
-rw-rw-r-- 1 itr itr 0 Jan 20 21:13 wildcard2

[Ww]ildcard?将匹配任何以Wildcardwildcard开头并以单个字符结尾的文件。处理大写和小写文件时,此选项非常有用。(请记住,Linux区分大小写,文件通配符与文件通配符不同)。

$ ls -l [Ww]ildcard?
-rw-rw-r-- 1 itr itr 0 Jan 20 21:12 wildcard1
-rw-rw-r-- 1 itr itr 0 Jan 20 21:42 Wildcard1
-rw-rw-r-- 1 itr itr 0 Jan 20 21:13 wildcard2
-rw-rw-r-- 1 itr itr 0 Jan 20 21:42 Wildcard2

使用[!]进行排除匹配

除了能够匹配方括号内的范围,还可以使用感叹号!来排除方括号内的匹配项。。

ls -l [Ww]ildcard[!1]将匹配文件wildcard2和Wildcard2(请参见下面的示例):

$ ls -l w*
-rw-rw-r-- 1 itr itr 0 Jan 20 21:12 wi1
-rw-rw-r-- 1 itr itr 0 Jan 20 21:12 wilcard
-rw-rw-r-- 1 itr itr 0 Jan 20 21:12 wildcard1
-rw-rw-r-- 1 itr itr 0 Jan 20 21:13 wildcard2
$ ls -l [Ww]ildcard[!1]
-rw-rw-r-- 1 itr itr 0 Jan 20 21:13 wildcard2
-rw-rw-r-- 1 itr itr 0 Jan 20 21:42 Wildcard2