find:paths must precede expression问题及解决

偏执的太偏执、 2022-05-28 04:21 209阅读 0赞

用find命令查找文件,用的是find ./ -name *.so,结果报错了,错误如下:

  1. find: paths must precede expression: libaudiotextdecoder.so
  2. 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

举个例子:

  1. 在当前目录下有两个文件test.ctest.h
  2. 1\#echo test.\*
  3. 返回结果是test.c test.h
  4. 所以如果用\#find . -name test.\* 相当于使用命令\#find . -name test.c test.h 当然就回报错了。
  5. 2\#echo "test.\*"
  6. 返回结果就是 test.\*
  7. 所以\#find . -name "test.\*" 命令不会报错。

综上:如果在使用find命令的当前目录里有多个能够替换”*“号的文件或者目录,就会报错。

那么如果当前目录只有一个可以替换“*”的文件或者目录,虽然报错但是是否安全呢?或者说会得到我们想要的结果吗?

再举个例子吧:在当前目录下只有有个名叫test1的目录,test1下面有test1.c test2.c test3.c三个文件

  1. \#find . -name test\*
  2. 返回结果:./test1
  3. 为什么只找到当前目录的test1目录呢?
  4. 我们看一下\#echo test\*的结果 ,结果是:test1,所以这条命令相当于命令\#find . -name test1,所以只会找到名字是test1的目录或者文件,这显然不是我们想要的结果。
  5. **综上:使用find命令时,只要使用了“\*”号,一定要加上单引号或者双引号。**

发表评论

表情:
评论列表 (有 0 条评论,209人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Express 安装问题

    前几天express 推出了4.0,得知这个消息,自己尝试了一下,突然发现用以前的文档上的操作出现了各种问题。结果只能去看文档,现在在这个给大家分享下4.0版本的安装。 先说