我正在制作脚本,以便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;
答案 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}}符号。