如何在使用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这样的,因为它的includeexclude标志,例如: –

 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/ 

其他一些有用的标志:

  • -rrecursion
  • -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 
  1. 将您的源文件夹复制到somedir

    cp -r srcdir somedir

  2. 删除所有不需要的文件:

    findsomedir -name'.svn'-exec rm -rf {} \ +

  3. somedir启动scp