使用scp
或rsync
时,我经常无法处理论据列表太长'错误。在使用mv
或rm
时,我可以使用find
和xargs
,但我无法理解如何使用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
答案 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
)