86

假设有一些具有这些结构的文件夹

/bench1/1cpu/p_0/image/
/bench1/1cpu/p_0/fl_1/
/bench1/1cpu/p_0/fl_1/
/bench1/1cpu/p_0/fl_1/
/bench1/1cpu/p_0/fl_1/
/bench1/1cpu/p_1/image/
/bench1/1cpu/p_1/fl_1/
/bench1/1cpu/p_1/fl_1/
/bench1/1cpu/p_1/fl_1/
/bench1/1cpu/p_1/fl_1/
/bench1/2cpu/p_0/image/
/bench1/2cpu/p_0/fl_1/
/bench1/2cpu/p_0/fl_1/
/bench1/2cpu/p_0/fl_1/
/bench1/2cpu/p_0/fl_1/
/bench1/2cpu/p_1/image/
/bench1/2cpu/p_1/fl_1/
/bench1/2cpu/p_1/fl_1/
/bench1/2cpu/p_1/fl_1/
/bench1/2cpu/p_1/fl_1/
....

我想要做的是scp以下文件夹

/bench1/1cpu/p_0/image/
/bench1/1cpu/p_1/image/
/bench1/2cpu/p_0/image/
/bench1/2cpu/p_1/image/

如您所见,我想递归使用scp但不包括所有名为“fl_X”的文件夹。似乎 scp 没有这样的选择。

UPDATE scp 没有这样的功能。相反,我使用以下命令

 rsync -av --exclude 'fl_*' user@server:/my/dir

但它不起作用。它只传输文件夹列表!!就像是ls -R

4

6 回答 6

67

虽然scp通过该选项支持递归目录复制-r,但它不支持文件过滤。有几种方法可以完成您的任务,但我可能会依赖find, xargs, tar, 而ssh不是scp.

find . -type d -wholename '*bench*/image' \
| xargs tar cf - \
| ssh user@remote tar xf - -C /my/dir

可以使rsync解决方案起作用,但是您缺少一些论据。rsync还需要rswitch 递归到子目录。此外,如果您想要与 相同的安全性scp,则需要在ssh. 就像是:

rsync -avr -e "ssh -l user" --exclude 'fl_*' ./bench* remote:/my/dir
于 2013-02-27T23:34:15.473 回答
27

您可以指定GLOBIGNORE和使用模式*

GLOBIGNORE='ignore1:ignore2' scp -r source/* remoteurl:remoteDir

您可能希望拥有可以通过 using 组合或覆盖的一般规则export GLOBIGNORE,但对于临时使用,只需上述方法即可。该:字符用作多个值的分隔符。

于 2017-05-02T11:22:49.787 回答
12

假设最简单的选项(在远程主机上安装 rsync)不可行,您可以使用sshfs在本地挂载远程,并从挂载目录执行rsync 。这样您就可以使用 rsync 提供的所有选项,例如--exclude.

这样的事情应该做:

sshfs user@server: sshfsdir
rsync --recursive --exclude=whatever sshfsdir/path/on/server /where/to/store

请注意,rsync 的有效性(仅传输更改,而不是所有内容)不适用于此处。这是因为要使其正常工作,rsync 必须读取每个文件的内容以查看发生了什么变化。但是,由于 rsync 仅在一台主机上运行,​​因此必须将整个文件传输到那里(通过 sshfs)。但是,不应传输排除的文件。

于 2014-04-28T14:16:21.617 回答
3

如果您使用 pem 文件进行身份验证,您可以使用以下命令(这将排除带有扩展名的文件):

rsync -Lavz -e "ssh -i <full-path-to-pem> -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null" --exclude "*.something" --progress <path inside local host> <user>@<host>:<path inside remote host>

-L 表示跟随链接(复制文件而不是链接)。使用 pem 文件的完整路径而不是相对路径。

不推荐使用 sshfs,因为它运行缓慢。此外,上面介绍的 find 和 scp 的组合也是一个坏主意,因为它会为每个文件打开一个 ssh 会话,这太昂贵了。

于 2016-08-17T04:04:22.773 回答
1

您可以使用扩展通配符,如下例所示:

#Enable extglob
shopt -s extglob

cp -rv !(./excludeme/*.jpg) /var/destination
于 2016-03-11T16:02:38.740 回答
0

这对我来说很好,因为目录结构对我来说并不重要。

scp -r USER@HOSTNAME:~/bench1/?cpu/p_?/image/ .

假设/bench1在当前用户的主目录中。此外,将 USER 和 HOSTNAME 更改为实际值。

于 2019-07-16T13:14:48.717 回答