红联Linux门户
Linux帮助

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

发布时间:2015-10-30 10:30:26来源:linux网站作者:飞信天下

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处理。


使用Find命令来帮你找到那些需要清理的文件:http://www.linuxdiyf.com/linux/13185.html

Linux find命令一个神奇之处:http://www.linuxdiyf.com/linux/4011.html

Linux find命令用法总结:http://www.linuxdiyf.com/linux/11869.html

Linux用find命令查找文件大小为XX的文件的办法:http://www.linuxdiyf.com/linux/2150.html

find命令不区分大小写:http://www.linuxdiyf.com/linux/13964.html