find命令错误提示路径必须在表达式之前

1、问题

$touch test1.c test2.c text3.txt
$ls
//当前目录下有三个文件
test1.c  test2.c  text3.txt     

$find . -iname *.txt
./text3.txt

 $find . -iname *.c
$find: paths must precede expression: test2.c
Usage: find [-H] [-L] [-P] [-Olevel] [-D help|tree|search|stat|rates|opt|exec] 
    [path...] [expression]

 $find . -iname \*.c
./test1.c
./test2.c

$find . -iname "*.c"
./test1.c
./test2.c

2、原因

(1)
man 1 find

 -name pattern
               Base  of  file  name  (the  path  with the leading directories removed) 
               matches shell pattern pattern.  
               The metacharacters (`*', `?', and `[]') match a `.' at the start of the base name 
               (this is a change in findu‐tils-4.2.2; see section STANDARDS CONFORMANCE below).  
               To ignore a directory and the files under it, use -prune; see an example 
               in the description of -path.  
               Braces are not recognised as being special, despite the fact  that  some shells 
               including Bash imbue braces with a special meaning in shell patterns.  
               The filename matching is performed with the use of the fnmatch(3) 
               library function.   
               Don't forget to enclose the pat‐tern in quotes in order to protect it 
               from expansion by the shell.

 -iname pattern
              Like -name, but the match is case insensitive.  For example, 
              the patterns `fo*' and `F??' match the file names `Foo', `FOO', `foo', `fOo', etc.   
              In these patterns, unlike filename will match the file `.foobar'.   
              Please note that you should quote patterns as a matter of course, 
              otherwise the shell will **expand any wildcard characters in them**.

NON-BUGS
       $ find . -name *.c -print
       find: paths must precede expression
       Usage: find [-H] [-L] [-P] [-Olevel] [-D help|tree|search|stat|rates|opt|exec] [path...] 
       [expression]

       This happens because *.c has been expanded by the shell resulting in find actually 
       receiving a command line like this:

       find . -name bigram.c code.c frcode.c locate.c -print

       That command is of course not going to work.  Instead of doing things this way, 
       you should enclose the pattern in quotes or escape the wildcard:
       $ find . -name \*.c -print

(2)
find -name 选项后面只能支持一个文件的搜索。
“*”是shell的metacharacter(元字符)。
如果直接是 *.txt, 则shell会解析为test3.txt(当前目录下只有一个.txt文件), 作为 pattern,传递给find。
变为: find . -iname test3.txt。故正确。
如果直接是 *.c, 则shell会解析为test1.c test2.c(当前目录下有两个.c文件), 作为 pattern,传递给find。
变为: find . -iname test1.c test2.c。对test2.c,其前面没有选项,故报错。
如果直接是 \*.c 或 “*.c”, 则shell 会把 它当作参数 *.c ,传给find处理。

参考文献:
[1] http://blog.csdn.net/firefoxbug/article/details/7618188 作者:firefoxbug
[2] Linux的man手册 作者:so many people

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值