find:paths must precede expression问题及解决
用find命令查找文件,用的是find ./ -name *.so,结果报错了,错误如下:
find: paths must precede expression: libaudiotextdecoder.so
Usage: find \[-H\] \[-L\] \[-P\] \[-Olevel\] \[-D help|tree|search|stat|rates|opt|exec\] \[path...\] \[expression\]
关于如何解决,有很多答案,也确实有用,但是我有个疑问,我之前一直这么用find命令没报错啊?于是我在其他目录下试了这个命令,也没报错,为什么就这个目录下会出现这种情况呢?解决问题的帖子上说是“星号被展开为当前目录下所有的文件,这样的匹配当然会出错”。我比较了出错和不出错目录下的echo * 和echo ‘*‘没发现什么区别,都会展开为当前目录的所有文件。
于是在论坛里问了这个问题,论坛链接:https://bbs.csdn.net/topics/392347893
答案在这里:https://blog.csdn.net/appleheshuang/article/details/7619586
-name后面只能跟一个文件名。如果有多个文件名出现就会报错:find: paths must precede expression
举个例子:
在当前目录下有两个文件test.c和test.h
(1)\#echo test.\*
返回结果是test.c test.h
所以如果用\#find . -name test.\* 相当于使用命令\#find . -name test.c test.h 当然就回报错了。
(2)\#echo "test.\*"
返回结果就是 test.\*
所以\#find . -name "test.\*" 命令不会报错。
综上:如果在使用find命令的当前目录里有多个能够替换”*“号的文件或者目录,就会报错。
那么如果当前目录只有一个可以替换“*”的文件或者目录,虽然报错但是是否安全呢?或者说会得到我们想要的结果吗?
再举个例子吧:在当前目录下只有有个名叫test1的目录,test1下面有test1.c test2.c test3.c三个文件
\#find . -name test\*
返回结果:./test1
为什么只找到当前目录的test1目录呢?
我们看一下\#echo test\*的结果 ,结果是:test1,所以这条命令相当于命令\#find . -name test1,所以只会找到名字是test1的目录或者文件,这显然不是我们想要的结果。
**综上:使用find命令时,只要使用了“\*”号,一定要加上单引号或者双引号。**
还没有评论,来说两句吧...