Linux shell 通配符
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?
将匹配任何以Wildcard
或wildcard
开头并以单个字符结尾的文件。处理大写和小写文件时,此选项非常有用。(请记住,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