Unix脚本for循环查找错误--- find:路径必须在表达式之前

时间:2013-07-22 04:15:39

标签: unix

我正在制作脚本,以便for循环使用find命令自动执行。 我收到错误“find:paths必须在表达式之前”

++ find alogic/batch/Instrument b/Instrument/Bank b/Instrument/container \
        b/Instrument/Authorize b/Instrument/Common b/Instrument/Confirm \
        -type d -type d '\(' -path alogic/batch/Instrument/BuyerCredit \
        -o -path alogic/batch/Instrument/DebitCard '\)' -prune -o -name \
        '*.cpp' -print
find: paths must precede expression

例如:

inclusive_directories =  alogic/batch/Instrument b/Instrument/Bank b/Instrument/container b/Instrument/Authorize b/Instrument/Common b/Instrument/Confirm

exclusive_unix_notation=
   -type d \( -path alogic/batch/Instrument/BuyerCredit -o -path alogic/batch/Instrument/DebitCard \)

脚本

for directory in `echo "$APPLOGIC_EXCLUSIVE" "$BIZ_EXCLUSIVE" "$PACKAGE_EXCLUSIVE" "$PIMP_EXCLUSIVE" "$OTHER_EXCLUSIVE"`
do
    if [[ -d "$directory" ]]; then
        #intially
        if [[ "$exclusive_unix_notation" == "" ]]; then
            exclusive_unix_notation=" -type d \( -path $directory"
        else
            exclusive_unix_notation="`echo $exclusive_unix_notation` -o -path $directory"
        fi
    fi
done
#if processed succesfully added the close brace
if [[ "$exclusive_unix_notation" != "" ]]; then
    exclusive_unix_notation="`echo $exclusive_unix_notation` \) "
fi

# generate cpp files with files to be excluded
for files in `find $inclusive_directories $exclusive_unix_notation -prune -o -name "*.cpp" -print`
do
    if [[ -f "$files" ]]; then
         echo "$files"
    fi
done | sed 's#^\./##' | sed 's/.cpp/.o/' | sort > $OBJ_LIST

exit;

1 个答案:

答案 0 :(得分:1)

您可能会使用

破坏您的脚本
"`echo $something` another thing"

对于你似乎正在做的事情,你可以简单地说:

myvar="$somevar another thing"

这样可以避免与多个命令扩展相关的所有问题。你的for循环不是最理想的。你为什么不拥有:

find some options -print | sed some other options | ...

要仅查看常规文件,可以将-type f添加到find命令。

保持简单的事情,并尝试了解你在做什么。超过需要通常会导致麻烦。

更新:除了我上面提到的一般建议之外,您还需要使用eval find $...。否则,您的命令行选项不会按预期单独查找,而是作为包含空格的单个选项。您看到的引号是由bash插入的,因此您可以看到\(已通过文字传递,并且它不仅仅是(实际上应该是。*。 使用eval有自己的挑战,因为它删除了一层转义和引用。因此,在您的情况下,您可能需要另外转义{{1}}符号。