find:路径必须在表达式之前

Posted

技术标签:

【中文标题】find:路径必须在表达式之前【英文标题】:find: paths must precede expression 【发布时间】:2014-02-13 18:22:47 【问题描述】:

我在两台机器上使用 CentOS 6.4 final。我正在执行一个脚本。 该脚本包含find 命令

path=$1
searchstring=$2 
echo `find $path -name $searchString`
for filename in `find $path -name $searchString`
do
echo "$filename"
echo
done

./findfiles.sh /var/log/ *.txt

上述脚本执行良好并打印文件。但是在第二台机器上我得到了usage error: find: paths must precede expression

原因是 *.txt 在 find 命令中被扩展。更改后 find $path -name "$searchString" 中的文件名 它执行得很好。

为什么第一台 CentOS 机器没有出现语法错误?

【问题讨论】:

类似:***.com/questions/6495501/… 【参考方案1】:

您需要使用正确的引用,否则 shell 会尝试扩展 *.txt find 看到它之前。

所以如果当前文件夹包含a.txtb.txt,那么find /var/log -name a.txt b.txt 将被执行-> find 会混淆你想用b.txt 做什么

这就是使用正确引用如此重要的原因。你的脚本应该是:

path="$1"
searchstring="$2" 
echo $(find "$path" -name "$searchString")
for filename in $(find "$path" -name "$searchString")
do
    echo "$filename"
    echo
done

请注意,我已经引用了变量赋值(否则,当您定义 searchstring 时会发生全局扩展。使用变量时也是如此。

$() 周围没有引号!如果您要在此处添加引号,则 find 将返回单个“单词”作为结果。

也总是更喜欢$(),而不是带有反引号的旧 inline-eval。它更可靠,更不容易出现细微错误并且更具可读性。

【讨论】:

【参考方案2】:

引用你的 shell 参数:

$ ./findfiles.sh /var/log/ '*.txt'

【讨论】:

谢谢卢茨!我做了同样的事情并且工作正常。我仍然对机器的行为感到困惑这就是我发布它的原因。

以上是关于find:路径必须在表达式之前的主要内容,如果未能解决你的问题,请参考以下文章

解决find命令报错:路径必须在表达式之前

“查找:路径必须在表达式之前:”如何指定在当前目录中也可以找到文件的递归搜索?

带有find命令的regextype

Linux命令查找文件或目录 find

Linux系统文件查找

linux find 正则表达式