我需要将所有.class文件从服务器复制到本地,并保留所有目录。例如server:/usr/some/unknown/number/of/sub/folders/me.class
将是/usr/project/backup/some/unknown/number/of/sub/folders/me.class
的问题是,还有许多其他无用的文件,如.svn-base文件,我不想要。我怎么能过滤它们所以我只有scp
.class文件?
由于它的rsync
和include
标志,我可能建议使用像exclude
这样的东西,例如: -
rsync -rav -e ssh --include '*/' --include='*.class' --exclude='*' \
server:/usr/some/unknown/number/of/sub/folders/ \
/usr/project/backup/some/unknown/number/of/sub/folders/
其他一些有用的标志:
-r
用于递归-a
用于存档(主要是所有文件)-v
用于详细输出-e
指定ssh而不是默认值(实际应该是ssh)要在基目录中排除dotfiles:
scp -r [!.]* server:/path/to/something
[!.]*
是一个shell glob,它扩展到工作目录中的所有文件,而不是以点开头。
scp中没有用于过滤文件的功能。对于像这样的“高级”东西,我建议使用rsync:
rsync -av --exclude '*.svn' user@server:/my/dir .
(此行将rsync从远程文件夹复制到当前文件夹)
默认情况下,最新版本的rsync会自动通过ssh连接。
既然你可以scp
你应该对ssh
,
编写以下脚本或登录并执行...
# After reaching the server of interest
cd /usr/some/unknown/number/of/sub/folders
tar cfj pack.tar.bz2 $(find . -type f -name *.class)
返回(注销)到本地服务器和scp
,
# from the local machine
cd /usr/project/backup/some/unknown/number/of/sub/folders
scp you@server:/usr/some/unknown/number/of/sub/folders/pack.tar.bz2 .
tar xfj pack.tar.bz2
如果你发现$(find ...)
太长了你的焦油改变,
find . -type f -name *.class | xargs tar cfj pack.tar.bz2
最后,既然你把它保存在/usr/project/backup/
,
为什么要麻烦提取?保持tar.bz2
,可能是日期+时间戳。
启用基于ssh密钥的身份验证后,以下脚本将起作用。
for x in `ssh user@remotehost 'find /usr/some -type f -name *.class'`; do y=$(echo $x|sed 's/.[^/]*$//'|sed "s/^\/usr//"); mkdir -p /usr/project/backup$y; scp $(echo 'user@remotehost:'$x) /usr/project/backup$y/; done
下面是文件命令。
scp`找到。 -maxdepth 1 -name“* .log”\! -name“hs_err_pid2801.log”-type f` root @ IP:/ tmp / test /
下面是目录命令。
scp -r`找到。 -maxdepth 1 -name“lo *”\! -name“localhost”-type d` root @ IP:/ tmp / test /
您可以根据自己的要求自定义上述命令。
如果你确实想使用scp,那就是间接的方式。我们想将本地文件夹'/ src'下的所有.jpg文件复制到远程服务器10.1.1.2中的文件夹'/ dst':
#make a clean temp folder
mkdir /tmp/ttt
#copy all .jpg file and retain folder structure as-is
find /src -type f -name *.jpg -exec cp --parents \{\} /tmp/ttt \;
#copy to remote target folder as-is and retain original time attributes
scp -rp /tmp/ttt/* 10.1.1.2:/dst
#if copy ok, remove temp folder
rm -rf /tmp/ttt
somedir
:
cp -r srcdir
somedir
somedir
发射scp