递归使用scp但不包括某些文件夹

时间:2013-02-27 20:06:20

标签: bash scp

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

/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没有这样的选择。

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

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

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

这样的东西

6 个答案:

答案 0 :(得分:42)

虽然scp支持使用-r选项进行递归目录复制,但它不支持过滤文件。有几种方法可以完成您的任务,但我可能会依赖findxargstarssh而不是scp

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

可以使rsync解决方案起作用,但是你缺少一些参数。 rsync还需要r切换到子目录。另外,如果您想要scp的相同安全性,则需要在ssh下进行转移。类似的东西:

rsync -avr -e "ssh -l user" --exclude 'fl_*' ./bench* remote:/my/dir

答案 1 :(得分:10)

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

这样的事情应该做:

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

请注意,rsync的有效性(仅转移更改,而非所有内容)并不适用于此处。这是因为要实现这一点,rsync必须读取每个文件的内容以查看更改的内容。但是,由于rsync仅在一台主机上运行,​​因此必须在那里传输整个文件(通过sshfs)。但是,不应传输排除的文件。

答案 2 :(得分:6)

您可以导出GLOBIGNORE并使用“*”

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

答案 3 :(得分:2)

如果您使用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会话。

答案 4 :(得分:0)

您可以使用扩展的globbing,如下例所示:

#Enable extglob
shopt -s extglob

cp -rv !(./excludeme/*.jpg) /var/destination

答案 5 :(得分:0)

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

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

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