前言
咱们在应用 shell 执行工作的过程中,经常会遇到须要解决一批数据的状况,如果咱们一个一个的传递参数就会十分的麻烦,这时候就须要用到 shell 的通配符性能了。例如 rm *.txt
能够删除当前目录下所有的 txt 文件。
性能
shell 通配符起到的是拓展参数的性能,留神 shell 通配符是由 shell 解决的,而不是用到参数的命令或者语句解决的。
例如对于 rm *.txt
,shell 在参数遇到通配符的时候,会把这个通配符当做门路或者文件的匹配模式去磁盘上搜寻所有的匹配项。
如果存在匹配,则把所有的匹配项替换到参数去,例如下面的命令最终的模式可能是 rm a.txt b.txt
,rm
命令拿到的是理论的文件列表,而不是*.txt
。
如果不存在匹配或者无奈辨认该模式,则 shell 会将该通配符作为一个一般字符传递给命令,而后再由命令去解决。例如如果咱们目录下没有任何 txt 文件,执行下面的命令就会报错:no matches found: *.txt
跨目录匹配
通配符只能匹配单层目录,如果要跨目录匹配,则要这样子写:
rm */*.txt
留神,下面的写法只能匹配一级子目录下的 txt 文件,没有方法匹配当前目录以及二级子目录下的文件
如果要匹配当前目录和一级子目录下的 txt 文件,则要用到多个通配符组合,例如如下命令
ls *{\/*,}.txt
留神,以上命令在当前目录或者一级目录之一没有 txt 文件的时候,也会报错。
通配符
shell 通配符看起来很像正则表达式,然而并不是正则表达式,它的性能比正则表达式要弱,只反对上面几种通配符模式。
*
匹配 0 或多个字符
?
匹配任意一个字符
[]
匹配 []
中的任意繁多字符,例如 [abc]
匹配 a、b、c 中的任何一个字符。[]
反对范畴匹配,例如 [a-z]
匹配所有小写字母。
{,}
匹配 {}
中被 ,
分隔的任意一个子字符串。例如 {AA,BB,CC}.txt
匹配到 AA.txt
、BB.txt
和 CC.txt
,{}
也反对范畴匹配,例如 {A..Z}
匹配所有大写字母
{}
和其余通配符不同的中央在于,即便没有匹配到数据,{}
仍然会开展。例如
# 如果咱们目录下没有文件 A,B,上面的命令会报错:no matches found: [AB]
echo [A-B]
# 上面的命令则会输入:A B
echo {A-B}
{}
反对嵌套,因而能够组合成简单的模式。例如
echo {a{a..c},b{b..c}}
#输入 aa ab ac bb bc
[!]和[^]
匹配除了 []
中的其余所有字符,也即不匹配 []
中的所有字符。
Enjoy it !
版权申明
转载请注明作者和文章出处
作者: X 学生
https://segmentfault.com/a/1190000023398532