分类:
2008-07-19 23:16:00
find中使用*的困惑
转载自:
当前目录有文件a.txt ,e.txt,test.txt,secure
1) find . -name *t
出错: 返回"path must precede expression"
2) find . -name *e
返回secure文件
3) find . -name "*txt"
返回所有txt文件
4) find . -name *[t]*
出错: 同1
5) find . -name "*[t]*" 或 find . -name *\[t\]*
返回所有文件名含有t字符的文件
问题1:为什么第一种*t出错,而*e却可以执行?
问题2:为什么*t和*[t]*不可以,必须加括号,是不是表达式扩展的问题? 如果被扩展了,真正传给shell的是什么内容?
答案: 如果在使用*的模式没有加上双引号,在将find的参数传递给find之前,shell首先要扩展*,将*t扩展成多个文件,然后将这多个文件组成的参数作为传递给find的参数,于是find就出错了,因为find只接受1个文件的参数。而*e没有错,是因为本目录只有一个符合*e的文件,因此*e被shell扩展成该文件后,传递给find命令作为参数,而且不会出错。因此我们最好在使用find,grep的时候将要查找的文件名字的pattern用双引号阔起来,这样shell就不会先进行扩展,就不会产生非预想的错误。 当然,除了用引号外,还可以用backslash字符,上面第5个例子,就是使用了backslash字符来转义[,这样[t]就不会被shell扩展,而交给find自己去扩展了。