find:使用-exec scp {}缺少`-exec'的参数

时间:2014-01-21 20:38:08

标签: shell

我写了一个脚本,它将登录到Prod服务器并找到一个文件并将其复制到StandBy服务器。

我的脚本是:

# ! /bin/ksh

ssh -l oracle -p 20022 IP_Address "find /opt/oracle/wcm/backup/export/ -name "*.DMP" -mtime -1 -exec scp {} oracle@IP_Address:/opt/oracle/wcm/impdumps"

运行脚本后我得到了:

find: missing argument to `-exec'

我看了所有文件说'{}'或\;在行尾,但没有任何作用。我做错了什么?

1 个答案:

答案 0 :(得分:0)

您需要使用转义命令分隔符结束-exec。来自the manual

-exec command ;
          Execute  command;  true  if 0 status is returned.  All following
          arguments to find are taken to be arguments to the command until
          an  argument  consisting of ‘;’ is encountered.  The string ‘{}’
          is replaced by the current file name being processed  everywhere
          it occurs in the arguments to the command, not just in arguments
          where it is alone, as in some versions of find.  Both  of  these
          constructions might need to be escaped (with a ‘\’) or quoted to
          protect them from expansion by the shell.

你在做什么应该工作;你建议你试着把'\;放在行尾',但是不清楚你是否在整个组合命令字符串的末尾做了它:

ssh ... "find ..." \;

哪个不起作用,仍然会给出'缺失参数'错误;或者在find命令的末尾,即在引用的命令中,您将作为参数传递给ssh

ssh ... "find ... \;"

您还有两个潜在的shell扩展层。 \;将由您的本地shell进行扩展,因此远程shell可以将其视为;。我想,你可能需要逃避它两次,不管它对我有用。

您还应该转义文件名模式周围的引号。

ssh -l oracle -p 20022 IP_Address "find /opt/oracle/wcm/backup/export/ -name \"*.DMP\" -mtime -1 -exec scp {} oracle@IP_Address:/opt/oracle/wcm/impdumps \\;"

您可能会发现直接在您的prod服务器上而不是远程运行此命令更简单,但我不知道您为什么选择这样做;或者如果您经常这样做,请在您的产品服务器上本地运行rsync。如果您坚持find,请注意手册中有关安全问题的警告,并考虑使用-execdir