gbash'git rm''find'命令

时间:2016-04-29 05:07:36

标签: bash shell

我想'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上的所有解决方案(请参阅注释掉的代码),但没有一个正常...

1 个答案:

答案 0 :(得分:1)

<强>更新

问题是你应该eval包含命令的变量的内容:

eval $COMMAND

来自man eval

  

eval实用程序应通过将参数连接在一起来构造命令,并将每个参数与<space>字符分开。构造的命令应由shell读取并执行。

原始回答

{}\;替换为{} \;{} +

阅读find的手册页。命令中使用的操作记录为:

  

-exec command ;

     

执行命令;如果返回0状态,则返回true。以下所有参数&gt;查找被认为是命令的参数,直到遇到由;组成的参数。字符串{}将被处理命令参数中出现的当前文件名替换...

因此命令失败,因为{}\;序列被解释为command