Bash 查找-执行与\;运行但+;终止符失败,并带有“;缺少参数-exec“;

Bash 查找-执行与\;运行但+;终止符失败,并带有“;缺少参数-exec“;,bash,unix,find,Bash,Unix,Find,有时,find命令拒绝使用+终止符执行其-exec,而只是将+更改为\允许exec运行 在进行以下设置后,请考虑: find_args=( -type f -name "*users*" -cmin -60 ) rsync_args=( -avhP -e 'ssh -i /home/some_user/.ssh/id_rsa -c arcfour' ) dest=some_user@some_host:/some/destination/ 这项工作: # runs rsync once p

有时,
find
命令拒绝使用
+
终止符执行其
-exec
,而只是将
+
更改为
\允许exec运行


在进行以下设置后,请考虑:

find_args=( -type f -name "*users*" -cmin -60 )
rsync_args=( -avhP -e 'ssh  -i /home/some_user/.ssh/id_rsa -c arcfour' )
dest=some_user@some_host:/some/destination/
这项工作:

# runs rsync once per file, thus slower than it should need to be
find . "${find_args[@]}" -exec rsync "${rsync_args[@]}" {} "$dest" \;
……但这次失败了:

# exactly the same, except for + rather than \;
# ...should use the same rsync call for multiple files.
find . "${find_args[@]}" -exec rsync "${rsync_args[@]}" {} "$dest" +
…出现错误
find:缺少'-exec'
的参数


我使用的是GNU findutils 4.4.2,它被记录为支持
+
参数。

find-exec。。。{}+
,则
+
必须紧跟在
{}
之后(因此插入的参数必须位于尾随位置)。您给定的命令不符合此要求


考虑以下解决方法:

find . -type f -name "*users*" -cmin -60 \
  -exec sh -c 'rsync -avhP -e "ssh -i /home/some_user/.ssh/id_rsa -c arcfour" "$@" some_user@some_host:/some/destination/' _ {} +

因为
sh-c[…]
行比它运行的
rsync
行长,所以传递给前者的任何参数列表都保证对后者有效,所以扩展
“$@”
总是会成功的。

Charles,我不认为这是重复的。事实上,您链接到的问题就是这个问题的答案。@ghoti,…另一个问题中的OP已经隔离了
find
不允许
{}…其他内容+并询问如何解决此问题。这里的OP还没有达到目的——但是,它们所涉及的限制是相同的,任何一个答案都会同时回答这两个问题。@ghoti,……当然,按照当前OP的方式思考另一个问题的人可能不太清楚,但这就是为什么我们(作为一个站点)想要好的副本,保留它们,允许人们从被愚弄的问题中获得代表性:作为单一规范知识来源的指南,尽管从不同角度/以不同的先验知识水平看待问题可能会有不同的解释。这一点很好。有人认为重复标记是一种陈述,当前问题可能应该删除,因为它是多余的。不同的人表达相似问题的方式会大不相同。或许可以颁布一个更灵活的“重复”定义: