2009-08-04 3 views
77

Ich muss alle .class-Dateien vom Server auf lokale kopieren mit allen reservierten Dir. z.B. server:/usr/some/unknown/number/of/sub/folders/me.class wird /usr/project/backup/some/unknown/number/of/sub/folders/me.class das Problem ist, gibt es viele andere nutzlose Dateien wie .svn-Basis-Dateien, die ich nicht will. Wie kann ich sie filtern, so dass ich nur scp .Class-Dateien?Wie filtert man Dateien, wenn man mit scp das Verzeichnis rekursiv kopiert?

+0

Ich mag die Rsync-Option erwähnt. Sie haben nicht erwähnt, ob dies eine einmalige Operation ist oder ob Sie dies wiederholt automatisieren. Für eine einmalige Operation sollte die vernünftige Verwendung von find, grep -v, xargs und temporären Dateien dies kurz machen. – user47559

Antwort

117

würde ich wahrscheinlich empfehlen so etwas wie rsync für dieses aufgrund seiner include und exclude Flaggen, zB: -

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/ 

Einige andere nützliche Fahnen:

  • -r für rekursive
  • -a für Archiv (meist alle Dateien)
  • -v für ausführliche Ausgabe
  • -e ssh anstelle des Standard festlegen (die ssh sein sollte, tatsächlich)
+3

Wie auch immer, um diese Unterordner zu ignorieren, die keine * class-Dateien in ihnen haben? (d. h. ich will keinen Haufen leerer Dirs) –

+0

genial, und das ist auch schnell böse! –

+1

Kannst du erklären --include, not --include = In den MAN Seiten konnte ich Erklärung finden auf --include = aber nicht --include – bazz

-1
  1. Kopieren Sie Ihre Quellordner in somedir:

    cp -r srcdirsomedir

  2. entfernen alle nicht benötigten Dateien:

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

  3. starten scp von somedir

+0

warum alle downvotes auf diese antwort? Das klingt nach einer Via-Lösung für die Frage. – bcarroll

+3

Da dies eine Reihe unnötiger Dateien kopieren würde, löschen Sie sie und verschwenden möglicherweise viel Zeit. – Oded

+0

Für ein Programm, das mehrere Übersetzungsschritte durchläuft, ist das sehr sinnvoll. Es könnte direkt vor dem Schritt gehen, der den kompilierten Code in eine 'tar'- oder' zip'-Datei packt. Stattdessen gibt es keine Komprimierung (scp führt die Komprimierung aus) und der "verpackte" Code wird kopiert. – samvv

32

Es gibt keine Funktion in scp zum Filtern von Dateien. Für „Erweitert“ Sachen wie diese, empfehle ich mit rsync:

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

(diese Zeile Kopie rsync aus fernen Ordnern zu aktuellen)

Neuere Versionen von rsync-Tunnel über eine SSH-Verbindung standardmäßig automatisch.

8

Da Sie scp Sie ssh,
entweder Skript die folgende oder Login in Ordnung sein sollte und ausführen ...

# After reaching the server of interest 
cd /usr/some/unknown/number/of/sub/folders 
tar cfj pack.tar.bz2 $(find . -type f -name *.class) 

Rückkehr zurück (Logout) zum lokalen Server und 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 

Wenn Sie die $(find ...) ist zu lang für Ihre Teer Änderung zu finden,

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

Schließlich, da Sie es in /usr/project/backup/ halten,
warum Extraktion die Mühe machen?Behalte einfach die tar.bz2, mit vielleicht einem Datum + Zeitstempel.

+0

Das hat mir geholfen. Ich bin in Windows und ich kämpfe mit dem Versuch, 'rsync' und' ssh' auf dem Betriebssystem installiert zu bekommen. Stattdessen war dies ein cleverer Workaround. Vielen Dank! – rayryeng

44

Um dotfiles in Basisverzeichnis auszuschließen:

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

Dies ist wahrscheinlich die beste Antwort; Mit Globs Dateien zu filtern ist der Weg zu gehen. –

+0

Wenn Ihre Option auf scp beschränkt ist, wie ich hatte, hat dies definitiv geholfen. – user28095

+0

Dies zeigt an, dass Dateien wie gefragt ausgeschlossen werden, aber wie kann dies für ein ganzes Verzeichnis erreicht werden? – Pille

1

Mit SSH-Schlüssel basierte Authentifizierung aktiviert, würde das folgende Skript arbeiten.

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

Unterhalb Befehl für Dateien.

scp `finden. -maxdepth 1 -name "* .log" \! -name "hs_err_pid2801.log" -type f 'root @ IP:/tmp/test/

  1. IP wird die Zielserver-IP-Adresse sein.
  2. -name "* .log" für Include-Dateien.
  3. \! -name "hs_err_pid2801.log" für Ausschlussdateien.
  4. . ist das aktuelle Arbeitsverzeichnis.
  5. -Typ f für den Dateityp.

Unterhalb Befehl für Verzeichnis.

scp -r `finden. -maxdepth 1 -name "lo *" \! -name "localhost" -type d root @ IP:/tmp/test/

Sie können den obigen Befehl gemäß Ihrer Anforderung anpassen.