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命令时,只要使用了“*”号,一定要加上单引号或者双引号。      



猜你喜欢

转载自blog.csdn.net/colorful_lights/article/details/79741890