假设有一些具有这些结构的文件夹
/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/
....
Run Code Online (Sandbox Code Playgroud)
我想要做的是scp以下文件夹
/bench1/1cpu/p_0/image/
/bench1/1cpu/p_1/image/
/bench1/2cpu/p_0/image/
/bench1/2cpu/p_1/image/
Run Code Online (Sandbox Code Playgroud)
如您所见,我想以递归方式使用,scp但不包括名为"fl_X"的所有文件夹.似乎scp没有这样的选择.
UPDATE scp没有这样的功能.相反,我使用以下命令
rsync -av --exclude 'fl_*' user@server:/my/dir
Run Code Online (Sandbox Code Playgroud)
但它不起作用.它只传输文件夹列表!! 就像是ls -R
jxh*_*jxh 45
虽然scp支持使用该-r选项进行递归目录复制,但它不支持对文件进行过滤.有几种方法来完成你的任务,但我可能会依靠find,xargs,tar和,ssh而不是scp.
find . -type d -wholename '*bench*/image' \
| xargs tar cf - \
| ssh user@remote tar xf - -C /my/dir
Run Code Online (Sandbox Code Playgroud)
该rsync解决方案可以进行工作,但你缺少一些参数.rsync还需要r切换到递归到子目录.此外,如果您想要相同的安全性scp,则需要进行转移ssh.就像是:
rsync -avr -e "ssh -l user" --exclude 'fl_*' ./bench* remote:/my/dir
Run Code Online (Sandbox Code Playgroud)
Mar*_*ian 11
假设最简单的选项(在远程主机上安装rsync)不可行,您可以使用sshfs在本地挂载远程数据,并使用挂载目录中的rsync.这样,您就可以使用rsync提供的所有选项--exclude.
这样的事情应该做:
sshfs user@server: sshfsdir
rsync --recursive --exclude=whatever sshfsdir/path/on/server /where/to/store
Run Code Online (Sandbox Code Playgroud)
请注意,rsync的有效性(仅转移更改,而非所有内容)不适用于此处.这是因为要实现这一点,rsync必须读取每个文件的内容以查看更改的内容.但是,由于rsync仅在一台主机上运行,因此必须在那里传输整个文件(通过sshfs).但是,不应传输排除的文件.
您可以导出GLOBIGNORE并使用"*"
GLOBIGNORE='ignore1:ignore2' scp -r source/* remoteurl:remoteDir
Run Code Online (Sandbox Code Playgroud)
如果您使用 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>
Run Code Online (Sandbox Code Playgroud)
-L 表示跟随链接(复制文件而不是链接)。使用 pem 文件的完整路径而不是相对路径。
不建议使用 sshfs,因为它运行缓慢。另外,上面介绍的 find 和 scp 的组合也是一个坏主意,因为它会为每个文件打开一个 ssh 会话,这太昂贵了。