2009-08-04 42 views
77

我需要将所有.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文件?如何在使用scp递归复制dir时过滤文件?

+0

我想提到的rsync的选项。你没有提到这是一次性操作,还是反复自动化。对于一次性操作,明智地使用find,grep -v,xargs和临时文件应该简化这个工作。 – user47559 2009-08-04 16:40:53

回答

117

我可能会建议使用像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/ 

其他一些有用的标志:

  • -r递归
  • -a(主要是所有文件)
  • -v详细输出
  • -e指定SSH而不是默认的(这应该是SSH,实际上)
+3

无论如何,要忽略其中没有* class文件的子文件夹? (也就是说我不想要一堆空的子弹) – 2013-10-25 15:09:23

-1
  1. 源文件夹复制到somedir

    CP -r srcdirsomedir

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

    找到somedir -name '.svn文件' -exec室射频{} \ +

  3. somedir启动scp

+0

为什么所有的这个答案downvotes?这听起来像是通过解决问题的方法。 – bcarroll 2014-08-28 13:30:07

+3

因为这会复制一堆不必要的文件,然后删除它们,浪费很多时间。 – Oded 2015-08-14 06:33:18

+0

对于经历多个编译步骤的程序,这实际上是非常有意义的。它可以在将编译后的代码打包成一个`tar`或`zip`文件的步骤之前进行。相反,没有压缩(scp执行压缩)并且“打包”的代码被复制。 – samvv 2016-05-24 18:08:55

32

在scp中没有功能来过滤文件。对于这样的“先进”的东西,我建议使用rsync:

rsync -av --exclude '*.svn' [email protected]:/my/dir . 

(这条线的副本从遥远的文件夹rsync将当前)rsync的隧道在默认情况下,一个ssh连接自动

最新版本。

8

既然你可以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 [email protected]:/usr/some/unknown/number/of/sub/folders/pack.tar.bz2 . 
tar xfj pack.tar.bz2 

如果您发现​​是您的焦油变化太久,

find . -type f -name *.class | xargs tar cfj pack.tar.bz2 

最后,因为您把它/usr/project/backup/
何苦提取?只需保留tar.bz2,可能有日期+时间戳。

44

要排除的dotfiles在基本目录:

scp -r [!.]* server:/path/to/something 
1

使用基于SSH密钥认证功能,下面的脚本会工作。

for x in `ssh [email protected] 'find /usr/some -type f -name *.class'`; do y=$(echo $x|sed 's/.[^/]*$//'|sed "s/^\/usr//"); mkdir -p /usr/project/backup$y; scp $(echo '[email protected]:'$x) /usr/project/backup$y/; done 
0

下面的文件命令。

SCP`找到。 -maxdepth 1 -name“* .log”\! -name“hs_err_pid2801.log”-type f` root @ IP:/ tmp/test/

  1. IP将是目标服务器的IP地址。
  2. -name “* .LOG” 包含文件。
  3. \! -name“hs_err_pid2801.log”用于排除文件。
  4. 。是当前工作目录。
  5. -type f用于文件类型。

以下命令目录。

SCP -r`找到。 -maxdepth 1 -name“lo *”\! -name “localhost” 的型D'根@ IP:/ tmp/test目录/

您可以自定义上面的命令按您的要求。