2023年7月26日发(作者:)
ls命令和find命令通配符和双引号的使⽤区别ls -l ab*find . -name “abc*”这⾥的*都是shell的⽂件通配符,包括 * ? []⾸先⽂件通配符和正则表达式含义是不同的。最⼤的差别在于:1."*" 在正则表达式中表⽰前⾯的字符重复任意次数,所以表⽰任意字符串".*", shell通配符中* 就表⽰任意字符串2. ".“在正则表达式中是任意⼀个字符,在通配符中没有其他任何含义,在通配符中”?"表⽰⼀个任意的字符shell 本⾝会对*进⾏解析,所以如果不希望shell解析"*", 就⼀定要把通配符⽤双引号括起来(单引号使⽤后,就什么都替换不了)ls -l ab* 这个*由shell来解析的,假如⽬录下⾯有ab1 abc ab2, 那这个命令⾸先会被shell转化为ls -l ab1 abc ab2。 ls本⾝没有解析通配符的能⼒。ls -l “ab*”, 那就会什么都没有,因为没有⼀个⽂件的名字是ab*find . -name "abc*"这个参数会原封不动的传给find, find命令本⾝具备解析通配符的能⼒,会在当前⽬录下⾯的各级⽬录下⾯寻找以abc开头的⽂件。find . -name abc* 那通配符会被shell解析,如果当前⽬录下没有以abc开头的⽂件,那传给find命令的就是空的,相当于:find . -namefind: missing argument to `-name’如果当前⽬录下游多个abc开头的⽂件,会出错,相当于:find . -name abc1 abc2find: paths must precede expression: abc2 就是说第⼆个name前⾯没有指定寻找的路径,如果当前⽬录下⾯只有⼀个abc开头的⽂件,那就不会出错,但是相当于:find . -name abc1最终最在所有的⽬录下⾯搜索abc1的⽂件,和我们的本意⼤相径庭。记住,-name选项搜索的是basename,不要再⾥⾯带"/"
问:ls后⾯的对象如果加了双引号,*就变成了普通字符。 SUSE11SP1_MWQ_TEST1:/test # ls test* test test1 test10 test2 test3 test5test6 test7 test8 test9 SUSE11SP1_MWQ_TEST1:/test # ls "test*" ls: cannot access test*: No such file 答:⾸先记住⼀点, 不加引号的 * ⾸先会被bash进⾏扩展,所以 ls test* 在执⾏ ls 命令前,bash先把 test* 替换成了 test1 test2 ... 然后 ls命令看到的参数实际上是 test1 test2 ..., 加了引号,bash就不去做替换了,那么 ls 命令看到的参数就是 test*同理, find 命令看到的参数是 -name test* 还是 -name test1 test2 ... 是有你是否给*加引号决定的。特别注意⼀点, find 命令的 -name 后⾯的参数是⽀持 * 做通配符的 (当然此时你要让find能收到命令参数中的*,所以必须加引号确保*不被bash预先扩展掉),这是find 命令⾃带的功能。其他命令可能并不⽀持,⽐如ls就不⽀持。
发布者:admin,转转请注明出处:http://www.yc00.com/web/1690366374a338913.html
评论列表(0条)