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.txt
和b.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:路径必须在表达式之前的主要内容,如果未能解决你的问题,请参考以下文章