【问题标题】:find: paths must precede expressionfind:路径必须在表达式之前
【发布时间】: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 机器没有出现语法错误?

【问题讨论】:

标签: linux shell centos centos6


【解决方案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'
    

    【讨论】:

    • 谢谢卢茨!我做了同样的事情并且工作正常。我仍然对机器的行为感到困惑这就是我发布它的原因。
    猜你喜欢
    • 1970-01-01
    • 2018-05-09
    • 2012-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-28
    • 2023-03-25
    • 2021-07-28
    相关资源
    最近更新 更多