假设有这些结构的某些文件夹
/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还没有这样的选项。
UPDATE 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的)转移。 排除的文件不应该被转移然而,。
您可以导出GLOBIGNORE和使用“*”
export GLOBIGNORE='ignore1:ignore2'
scp -r source/* remoteurl:remoteDir
如果使用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的不推荐,因为它的工作原理慢。 此外,用上面介绍的发现和SCP的组合也是一个糟糕的主意,因为这将每个文件,该文件是太昂贵打开一个SSH会话。
您可以使用扩展的通配,如下面的例子:
#Enable extglob
shopt -s extglob
cp -rv !(./excludeme/*.jpg) /var/destination