我想'git rm'一堆'find'命令找到的文件。文件应该有一个后缀。我明白了:
TEST_PATH='/usr/src'
function main() {
for i in "$@"
do
echo "current i = ${i}"
COMMAND='find $TEST_PATH -maxdepth 20 -name '*_${i}.txt' -exec git rm {} \;'
# COMMAND="$(find $TEST_PATH -maxdepth 20 name '*_${i}.txt' -print0 | xargs -0 -I{} cp {} .)"
# COMMAND="find $TEST_PATH -maxdepth 20 -name '*_${i}.txt' -exec cp {} . \;"
# COMMAND="find . '*.BUILD' | while read file; do echo "$file"; done \;"
done
echo "Running Command: $COMMAND"
$COMMAND
}
gbash::main "$@"
运行它会抛出这样的错误:
$ sh abc.sh 123
current i = 123
Running Command: find ../../src/python/servers/innertube/tests/ -maxdepth 20 -name "*_9421870.txt" -exec rm {}\;
find: missing argument to `-exec'
我已经阅读并尝试了stackoverflow上的所有解决方案(请参阅注释掉的代码),但没有一个正常...
答案 0 :(得分:1)
<强>更新强>
问题是你应该eval
包含命令的变量的内容:
eval $COMMAND
来自man eval
:
eval实用程序应通过将参数连接在一起来构造命令,并将每个参数与
<space>
字符分开。构造的命令应由shell读取并执行。
原始回答
将{}\;
替换为{} \;
或{} +
。
阅读find
的手册页。命令中使用的操作记录为:
-exec command ;
执行命令;如果返回0状态,则返回true。以下所有参数&gt;查找被认为是命令的参数,直到遇到由
;
组成的参数。字符串{}
将被处理命令参数中出现的当前文件名替换...
因此命令失败,因为{}\;
序列被解释为command
。