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
相关文章推荐
- WPF获取应用程序路径方法,获取程序运行路径方法
- Usart的单线半双工模式(stm32F10x系列)
- swift基本类型
- java Vamei快速教程20 GUI
- 《程序员面试金典(第五版)》7.7:找出只含3/5/7因子的第K个数
- clearInterval()与setInterval()的使用心得
- C++类成员冒号初始化以及构造函数内赋值
- robot framework 最全的Variables
- CImg
- Server IPC version 9 cannot communicate with client version 4
- html-表单的应用
- 习题 1-5 打折
- Oracle学习第三讲
- POJ 2296 Map Labeler
- Android 通过solid来定义不同边框的颜色,可以只定义一个边框的颜色
- 关于进程与线程的讲解
- Head First C#(赛狗日)
- oracle通过impdp导入不同表用户、不同表空间的数据
- Head First C#(赛狗日)
- Windows 下用 SourceInsight 与 Linux 协作编码利用Samba的共享