Bash:无法使用find -exec

时间:2017-06-09 16:00:54

标签: bash macos rsync scp find-util

使用scprsync时,我经常无法处理论据列表太长'错误。在使用mvrm时,我可以使用findxargs,但我无法理解如何使用find和{{1}尽管有关该主题的所有SE帖子。请考虑以下问题......

我试过

-exec

所以我试过

$scp /Path/to/B* Me@137.92.4.152:/Path/to/

-bash: /usr/bin/scp: Argument list too long

所以我试过

$find . -name "/Path/to/B*" -exec scp "{}" Me@137.92.4.152:/Path/to/ '\;'

find: -exec: no terminating ";" or "+"

所以我试过

$find . -name "/Path/to/B*" -exec scp "{}" Me@137.92.4.152:/Path/to/ ';'

find: ./.gnupg: Permission denied
find: ./.subversion/auth: Permission denied

并且没有任何事情我输入密码

我使用的是Mac OSX版本10.11.3,终端版本2.6.1

3 个答案:

答案 0 :(得分:2)

更新后编辑:

find "/Path/to" -maxdepth 1 -name "B*" -exec scp {} Me@137.92.4.152:/Path/to/ \;

答案 1 :(得分:2)

R. Saban's helpful answer解决了主要问题:

  • -name只接受文件名模式,而非路径模式。

  • 或者,您只需使用-path主要内容而不是-name主要内容。

至于使用scp尽可能少的调用 - 每个调用都需要默认指定密码:

  • 作为替代方案,请考虑完全绕过scp的使用,如Eric Renouf's helpful answer中所述。

  • 虽然find的{​​{1}}主要允许使用终结符-exec代替+(必须将其作为;或{{传递1}}以防止 shell ';'解释为命令终止符),以传递适合单个命令行的文件名(内置\;,在某种程度上说,这不是一个选项,因为使用;要求占位符xargs在命令行上 last ,紧接在{{1}之前}。

  • 但是,由于您使用的是macOS,因此您可以使用BSD +的非标准{}选项将占位符放置在命令行的任何位置,同时仍然尽可能多地传递参数(使用BSD +的非标准xarg选项与-J的非标准find选项一起确保所有文件名都通过就像,即使他们有嵌入空格,例如):

-print0

现在,您最多会被提示几个次:每个参数的一个提示,根据需要在观察最大值时容纳所有参数。命令行长度,可能的呼叫次数最少。

答案 2 :(得分:0)

不需要多个scp连接(因此也不需要密码输入)的解决方案是一边是tar而另一边是untar:

find /Path/to -maxdepth 1 -name 'B*' -print0 | tar -c --null -T - | ssh ME@137.92.4.152 tar -x -C /Path/to

假设您的find版本支持-print0等。它的工作原理是从find打印出空终止的文件列表,并告诉tar从stdin(-T -)读取其文件列表,将列表视为空终止(--null )并创建一个新的存档(-c)。默认情况下,tar将写入stdout。

然后我们将该存档通过ssh命令传递给目标主机。这将在其stdin上读取上一个命令的输出,因此我们将使用tar将存档提取(-x)到给定目录(-C /Path/to