Chinaunix首页 | 论坛 | 博客
  • 博客访问: 993185
  • 博文数量: 200
  • 博客积分: 5011
  • 博客等级: 大校
  • 技术积分: 2479
  • 用 户 组: 普通用户
  • 注册时间: 2008-06-27 15:07
文章分类

全部博文(200)

文章存档

2009年(12)

2008年(190)

我的朋友

分类:

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自己去扩展了。

阅读(1048) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

chinaunix网友2008-10-18 13:40:42

shell 是怎么在扩展的?