您的位置:首页 > 其它

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

2015-10-28 20:45 274 查看

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: