关于find命令在shell环境工作时出错的理解

来源:互联网 发布:网络销售成功案例 编辑:程序博客网 时间:2024/06/08 09:14

文章出处:http://zhousir1991.diandian.com/page/4


 [root@my ~]# find . -name *.rpm 
./Nessus-4.0.1-es5.i386.rpm 

[root@my ~]# find . -name *.tar.gz 
find: paths must precede expression: recordmydesktop-0.3.8.1.tar.gz 
Usage: find [-H] [-L] [-P] [-Olevel] [-D help|tree|search|stat|rates|opt|exec] [path...] [expression] 

[root@my ~]# find . -name '*.tar.gz' 
./gtk-recordmydesktop-0.3.8.tar.gz 
./recordmydesktop-0.3.8.1.tar.gz

以上是本人遇到的问题,加了单引号之后解决:网上找到相关资料得以解决,引自互联网, 版权问题请联系本人! 


find / -name mysql* 中 -name的参数并不是实际的 mysql* ,而是shell 先解析msyql* ,如果在当前目录能找到mysql开头的文件名或者目录名,将匹配后的文件名或者目录名作为name的参数传给它,分以下三种情况: 
1、假如当没有可匹配的shell将 mysql* 传给find; 
2、假如只匹配到一个会正常执行find命令,但是结果是错误的,比如当前目录只有mysqla一个目录或者文件,shell会将 mysqla 作为name的参数传给find,然后执行命令; 
3、假如匹配到多个就会报错,错误提示如下: 
find: paths must precede expression 
Usage: find [-H] [-L] [-P] [path...] [expression] 

也就是说当有多个文件或者目录被匹配时,shell会将被匹配的所有文件或者目录名作为name的参数传给find,这样就致使find无法正常执行。比如当前目录有mysqla , mysqlb 里面文件,shell匹配后的命令行是find / -name mysqla mysqlb ,这样find就无法正常执行。 

而find / -name “mysql*” ,shell不会解析 mysql* 这个表达式,直接将mysql* 传给find,find会正常执行,并且得到你想要的结果。 

总结:在以后的shell使用过程中应力求严谨!