请教个问题:
find /tmp/ -name *.txt -exec ls -l {} \;
find: 路径必须在表达式之前
Usage: find [-H] [-L] [-P] [path...] [expression]
上面的路径我检查了好几遍,没啥问题。老是出现下面的报警:
find: 路径必须在表达式之前
Usage: find [-H] [-L] [-P] [path...] [expression]
正确格式:
find /tmp/ -name \*.txt -exec ls -l {} \;
find /tmp/ -name "*.txt" -exec ls -l {} \;
通过find查找目录所有后缀名txt的文件,命令为
find /tmp/ -name *.txt -exec ls -l {} \;
会出现“find: 路径必须在表达式之前”的错误提示。解决的方法有两种
- 使用转义符把*转义,即 \*.txt
- 用引号引起来 ,即"*.txt"
注意:如果需要把find 的结果提交给while,则既需要转义符,也需要引号
原因:
首先,shell 会扩展*.txt 如果有匹配,根据匹配的数量会有不同的结果。
0 个匹配: *.txt 仍然保持不变
1 个匹配: *.txt 变成那个匹配的文件名
多于 1 个匹配: *.txt 变成多个单词,也就是所有匹配的文件名
例如:/tmp下有1.txt 2.txt就会报错,因为find命令成为了
find /tmp/ -name 1.txt 2.txt -exec ls -l {} \;
只有1.txt会被识别,2.txt无法识别所以会报错。如果要在 -name 中使用正则表达式,必须加以转义,防止 shell 首先扩展它。转义的办法就是加上\或者引号,这样 -name 选项总是只接受这一个参数。
不过在我机器上不转义也不会报错,我觉得各个linux版本之间可能还是会有差异,这个没有对与错,但是需要有一个标准,写命令的时候要按照标准来写,也就是都加上转义,以免写脚本的时候其他机器报错。