2009-08-04 62 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目錄/

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