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 doscp/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/ .