请教个问题:
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: 路径必须在表达式之前”的错误提示。解决的方法有两种

  1. 使用转义符把*转义,即 \*.txt
  2. 用引号引起来 ,即"*.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版本之间可能还是会有差异,这个没有对与错,但是需要有一个标准,写命令的时候要按照标准来写,也就是都加上转义,以免写脚本的时候其他机器报错。