假设有一些具有这些结构的文件夹
/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
答案 0 :(得分:42)
虽然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
答案 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更改为真实值。