2007年5月28日星期一

find命令中的引号

find命令在根据文件特征(文件名,文件权限,创建时间等等)搜索文件时经常使用。

我们经常使用:

find . -name STRING

来搜索文件名为STRING的文件,也可以使用:

find . -name '*.*'

来列出当前目录下,以及目录下子目录,子目录的子目录.....的所有文件。

但是为什么要将*号用引号括起来呢?这和

ls *有什么不同呢?

实际上*这种特殊的字符,在shell中会做为特殊的处理。也就是说当你输入ls *时,处理实际上分为两部分。第一部分,shell会首先将*号做处理,将*号转换为指定目录下的文件名(或者文件夹名);第二部分shell才会运行转换后的ls命令。譬如:当前目录下有三个文件:a,b,c。那么运行ls *的时候,*号实际上先转换为a,b,c,而后才运行ls a b c。所以你输入ls *时,实际上shell最后运行的是ls a b c。

而find命令的具体用法是将最后的字符串和指定目录下的文件名作比较,若是相同则显示文件,若是不同则跳过。因此在我们假设的环境下当你输入find . -name * 的时候实际最后运行的是:

find . -name a b c

这样实际上是不符合find命令的语法,所以系统会报错,若是系统只有一个文件a(没有其他任何文件和文件夹),那么find . -name *是可以运行的,因为它实际上运行的是:

find . -name a

所以我们需要将*号引用变为字符串,这样shell不会首先将他转换,而是将它做为字符串参数传递给find以便以后和其他文件名的比较,比较时*会符合任何文件名,因此命令正常情况下列出所有查询目录下的文件和文件夹。

没有评论: