Bash 递归使用scp,但不包括一些文件夹

Bash 递归使用scp,但不包括一些文件夹,bash,scp,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/ /be

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

/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

的内容虽然
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
还需要
r
开关递归到子目录中。此外,如果您希望获得与
scp
相同的安全性,则需要在
ssh
下进行传输。比如:

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

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

这样做应该可以:

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

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

您可以使用扩展全局绑定,如下例所示:

#Enable extglob
shopt -s extglob

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

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

rsync-Lavz-e“ssh-i-o strichostkeychecking=no-o UserKnownHostsFile=/dev/null”--排除“*.something”--进度@:
L表示跟随链接(复制文件而不是链接)。 使用pem文件的完整路径,而不是相对路径


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

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

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

您可能希望使用
export GLOBIGNORE
组合或覆盖一般规则,但对于特殊用途,只需执行上述操作即可。
字符用作多个值的分隔符。

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

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

假设
/bench1
位于当前用户的主目录中。另外,将用户和主机名更改为实际值。

查看rsync,它可以使用
scp
(或至少
ssh
)作为其传输机制,并支持从其参数中排除某些子目录。这可以吗<代码>rsync-av--排除'fl_u*'user@server:/my/dir.我认为这是正确的想法。我在评论中提到了这一点,因为我对自己的
rsync
技能没有足够的信心来提供一个明确的答案。它不起作用。有人请查看更新的postcan you do
scp/bench1/1cpu/p_*/image/*remotehhost:/path/2/remote
?祝你好运,“过滤”在哪里?您正在使用
tar
进行存档?
find
正在我的解决方案中为您进行筛选
tar
在本地端打包要复制的目录,在远程端解包。@jgomo3:Yes,您可以使用
ssh
和执行
tar
在远程打包文件,并在本地使用
tar
解包。@alonsos:
find
命令识别与提供的模式匹配的目录并将其打印出来。
xargs
命令读取输入并将其作为
tar
命令的参数,然后该命令将归档所有目录。
ssh
命令连接到远程计算机,并在远程计算机上执行
tar
,这会将归档文件解压到
/my/dir
目录中。我会添加压缩以使网络数据尽可能小。将
tar cf
更改为
tar zcf
。另请参见.worked,但必须将
--exlude param
放在
rsync
命令的后面;否则我会遇到
错误:当复制多个文件时,目标必须是目录,并且它应该是
exclude=param
而不是
exclude param
奇怪,我的rsync版本不关心顺序。尽管如此,我还是改变了它,以避免人们遇到问题。谢谢。或者不导出:
globignore1:ignore2'scp-r source/*remoteurl:remoteDir
工作得很好,谢谢
find
scp
可能需要每个文件都有
ssh
会话。但这不是我的答案。
scp -r USER@HOSTNAME:~/bench1/?cpu/p_?/image/ .