文章目录
- 一. 有哪些文件通配符
- 二. 匹配任意
- ?:匹配任意一个字符
- *:匹配任意数量的字符串
- 三. 匹配任意指定一个字符
- 1. []:匹配任意包含
- 匹配任意包含
- 字符范围
- 2. [!]与[^]:匹配任意不包含
- 四. 注意事项
- 1. 通配符组合
- 2. 不能跨越目录层级进行通配
- 3. 不能匹配文件名前面的点号
一. 有哪些文件通配符
如下图特殊符号具有能够代替(/通配)路径名或文件名的功能。
假设一个文件夹下有如下文件:
$ ls
README.md file1.txt file2.txt file3.txt file4.txt string.c string.h string.txt
二. 匹配任意
?:匹配任意一个字符
string.后面有一个任意字符的文件名
$ ls string.?
string.c string.h
如果连续指定三个?,则可以匹配到任意三个字符。
$ ls string.???
string.txt
*:匹配任意数量的字符串
如下,匹配任何以.txt结尾的文件名。
$ ls *.txt
file1.txt file2.txt file3.txt file4.txt string.txt
因为 * 也可以匹配到空字符串,所以使用string*.c这种写法也可以匹配到string.c文件。
$ ls string*.c
string.c
三. 匹配任意指定一个字符
1. []:匹配任意包含
匹配任意包含
在[]中列出多个字符,就可以匹配到含有其中任意一个字符的文件。
如下,可以匹配到string.c和string.h两个文件。
$ ls string.[ch]
string.c string.h
字符范围
在[]中还能使用连字符指定字符的范围。
数字
比如,file[1-3]这种写法就可以匹配到file1、file2、file3中的任意字符。
$ ls file[1-3].txt
file1.txt file2.txt file3.txt
字符
通过连字符还可以指定字符范围指。
比如,使用[a-z]就可以匹配到所有的小写字母。
另外,如果想在[]中匹配连字符本身,可以像[-abc]或者[abc-]这样将连字符写到开头或者末尾。
2. [!]与[^]:匹配任意不包含
如果[]中的第1个字符是!或者^,则表示相反的意义,即匹配任意一个不在[]中的字符。
匹配file2.txt和file4.txt之外的文件名
$ ls file[!24].txt
file1.txt file3.txt
如果想在[]中匹配 ! 或 ^ 符号本身,可以
- 像[\^]这样在前面加上\
- 或者像[abc\]或[abc!]这样,将^或!放到开头以外的位置。
[root@m3v bin]# ls hadoop.[\!]*
hadoop.!ad
[root@m3v bin]# ls hadoop.[!]*
ls: cannot access hadoop.[!]*: No such file or directory
四. 注意事项
1. 通配符组合
匹配所有以.c或.h结尾的文件
$ ls *.[ch]
string.c string.h
2. 不能跨越目录层级进行通配
通配符不能匹配(分隔目录的)分隔号。
$ ls /usr/bin/*zip
/usr/bin/gpg-zip /usr/bin/gunzip /usr/bin/gzip
3. 不能匹配文件名前面的点号
$ touch .hidden
$ ls *hidden
ls: 无法访问*hidden: 没有那个文件或目录
因此,要想匹配到隐藏文件,需要显式地在文件名前面加上点号。
$ ls .*en
.hidden