1

我正在编写脚本,以便 for 循环使用 find 命令自动执行。我收到错误“查找:路径必须在表达式之前”

++ 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;
4

1 回答 1

1

您可能正在破坏您的脚本

"`echo $something` another thing"

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

myvar="$somevar another thing"

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

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

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

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

更新:除了我上面所说的一般建议之外,您还需要使用eval find $.... 否则,您的命令行选项不会像预期的那样单独传递给 find ,而是作为带有空格的单个选项传递。您看到的引号是由 bash 插入的,因此您会看到 the\(是通过文学形式传递的,而不仅仅是 a(应有的样子。但是,使用 eval 有其自身的挑战,因为它消除了一层转义和引用。因此,在您的情况下,您可能需要另外转义该*符号。

于 2013-07-22T06:43:20.743 回答