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本⾝没有解析通配符的能⼒。
find查命令的使用ls -l “ab*”, 那就会什么都没有,因为没有⼀个⽂件的名字是ab*
find . -name "abc*"这个参数会原封不动的传给find, find命令本⾝具备解析通配符的能⼒,会在当前⽬录下⾯的各级⽬录下⾯寻以abc 开头的⽂件。
find . -name abc* 那通配符会被shell解析,如果当前⽬录下没有以abc开头的⽂件,那传给find命令的就是空的,相当于:
find . -name
find: missing argument to `-name’
如果当前⽬录下游多个abc开头的⽂件,会出错,相当于:
find . -name abc1 abc2
find: 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 test5 test6 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就不⽀持。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。