如何在使用scprecursion复制dir时过滤文件?
我需要将所有.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
recursion -
-a
档案(主要是所有文件) -
-v
输出详细信息 -
-e
指定ssh而不是默认的(实际上应该是ssh)
要排除基本目录中的dotfiles:
scp -r [!.]* server:/path/to/something
scp中没有function来过滤文件。 对于像这样的“高级”东西,我推荐使用rsync:
rsync -av --exclude '*.svn' user@server:/my/dir .
(这行从远程文件夹复制rsync到当前的一个)
最近版本的rsync通过SSH连接自动默认。
既然你可以scp
你应该可以ssh
,
要么脚本以下或login并执行…
# 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
,可能有一个date+时间戳。
使用基于SSH密钥的身份validation启用,下面的脚本将工作。
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
-
将您的源文件夹复制到
somedir
:cp -r
srcdir
somedir
-
删除所有不需要的文件:
findsomedir -name'.svn'-exec rm -rf {} \ +
-
从
somedir
启动scp