Wie filtere ich Dateien, wenn ich mit scp rekursiv kopiere?

98

Ich muss alle .class-Dateien vom Server auf den lokalen kopieren, wobei alle Verzeichnisse reserviert sind. zB server:/usr/some/unknown/number/of/sub/folders/me.classwird /usr/project/backup/some/unknown/number/of/sub/folders/me.classdas problem sein, es gibt viele andere nutzlose dateien wie .svn-base dateien, die ich nicht will. Wie kann ich sie filtern, damit ich nur scp.class-Dateien habe?

derrdji
quelle
Ich mag die erwähnte rsync-Option. Sie haben nicht erwähnt, ob dies eine einmalige Operation ist oder ob Sie dies wiederholt automatisieren. Für eine einmalige Operation sollte die umsichtige Verwendung von find-, grep -v-, xargs- und temporären Dateien eine kurze Arbeit leisten.
user47559

Antworten:

151

Ich würde wahrscheinlich empfehlen, so etwas rsynczu verwenden, da es includeund excludeFlaggen enthält, z. B.: -

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 Flags:

  • -r für rekursiv
  • -a für das Archiv (meistens alle Dateien)
  • -v für ausführliche Ausgabe
  • -e ssh anstelle des Standardwerts angeben (der eigentlich ssh sein sollte)
Gavin Gilmour
quelle
4
Wie auch immer, um Unterordner zu ignorieren, die keine * Klassendateien enthalten? (dh ich will nicht ein paar leere dirs)
Grant Birchmeier
genial, und das ist auch schnell böse!
Prasad Chalasani
2
Können Sie --include, nicht --include = In den MAN - Seiten erklären, ich konnte Erklärung auf --include = aber nicht --include finden
bazz
1
Die Option enthält -abereits -rgemäß den rsync-Manpages.
Georg Schölly
3
@GrantBirchmeier --prune-empty-dirsentfernt die leeren Verzeichnisse.
Elrond1337
74

So schließen Sie Punktdateien im Basisverzeichnis aus:

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

[!.]* ist ein Shell-Glob, der auf alle Dateien im Arbeitsverzeichnis erweitert wird, die nicht mit einem Punkt beginnen.

rgtk
quelle
10
Dies ist wahrscheinlich die beste Antwort; Die Verwendung von Globs zum Filtern von Dateien ist der richtige Weg.
Yoshua Wuyts
1
Wenn Ihre Option auf scp beschränkt ist, wie ich es getan habe, hat dies definitiv geholfen.
user28095
3
Dies bedeutet, dass Dateien ausgeschlossen werden müssen, die gefragt werden. Wie kann dies jedoch für ein ganzes Verzeichnis erreicht werden?
Pille
37

In scp gibt es keine Funktion zum Filtern von Dateien. Für "fortgeschrittene" Dinge wie diese empfehle ich die Verwendung von rsync:

rsync -av --exclude '*.svn' user@server:/my/dir .

(Diese Zeile kopiert rsync aus dem entfernten Ordner in den aktuellen)

Neuere Versionen von rsync tunnel standardmäßig automatisch über eine ssh-Verbindung.

Ville Laurikari
quelle
10

Da Sie können scp, sollten Sie in Ordnung sein ssh,
entweder das folgende Skript zu schreiben oder sich anzumelden und auszufü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)

Zurück (Abmelden) zum lokalen Server und 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

Wenn Sie feststellen, dass das $(find ...)zu lang ist, um Ihren Teer zu ändern,

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

Schließlich, da Sie es behalten /usr/project/backup/,
warum die Extraktion stören? Behalten Sie einfach die tar.bz2, vielleicht mit einem Datum + Zeitstempel.

nik
quelle
Das hat mir geholfen. Ich bin in Windows und ich kämpfe zu bekommen versucht rsyncund sshauf dem Betriebssystem installiert. Stattdessen war dies eine clevere Problemumgehung. Vielen Dank!
Rayryeng
2

Unterer Befehl für Dateien.

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

  1. IP ist die IP-Adresse des Zielservers.
  2. -name "* .log" für Include-Dateien.
  3. \! -name "hs_err_pid2801.log" zum Ausschließen von Dateien.
  4. . ist das aktuelle Arbeitsverzeichnis.
  5. -Typ f für Dateityp.

Unterer Befehl für Verzeichnis.

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

Sie können den obigen Befehl gemäß Ihren Anforderungen anpassen.

Suneet Khurana
quelle
1

Wenn die SSH-Schlüssel-basierte Authentifizierung aktiviert ist, funktioniert das folgende Skript.

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
varun
quelle
1

Wenn Sie tatsächlich scp verwenden möchten, gibt es einen indirekten Weg. Sagen wir, wir möchten alle JPG-Dateien unter dem lokalen Ordner '/ src' in den Ordner '/ dst' auf dem Remote-Server 10.1.1.2 kopieren:

#make a clean temp folder
mkdir /tmp/ttt
#copy all .jpg file and retain folder structure as-is
find /src -type f -name *.jpg -exec cp --parents \{\} /tmp/ttt \;
#copy to remote target folder as-is and retain original time attributes
scp -rp /tmp/ttt/* 10.1.1.2:/dst
#if copy ok, remove temp folder
rm -rf /tmp/ttt
Scott Chu
quelle
0
scp -i /home/<user>/.ssh/id_rsa -o "StrictHostKeyChecking=no" -rp /source/directory/path/[!.]* <target_user>@<target_system:/destination/directory/path
Vinay Babu
quelle
mündliche Erklärungen sind auch hilfreich zusammen mit Code
con
-1
  1. Kopieren Sie Ihren Quellordner in somedir:

    cp -r srcdir somedir

  2. Entfernen Sie alle nicht benötigten Dateien:

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

  3. starte scp von somedir

dfa
quelle
Warum all die Abstimmungen zu dieser Antwort? Dies klingt nach einer Via-Lösung für die Frage.
bcarroll
7
Da dies eine Reihe unnötiger Dateien kopieren und dann löschen würde, würde dies möglicherweise viel Zeit verschwenden.
Oded
Für ein Programm, das mehrere Kompilierungsschritte durchläuft, ist dies tatsächlich sehr sinnvoll. Es könnte direkt vor dem Schritt gehen, der den kompilierten Code in eine taroder zip-Datei packt. Stattdessen gibt es keine Komprimierung (scp führt die Komprimierung durch) und der 'gepackte' Code wird kopiert.
Samvv
wahr, dass @samvv (alles hängt von der Einrichtung, Umgebung)
San Jay Falcon
Wenn Dateien aus Platzgründen ignoriert werden, wird sowohl Platz als auch Zeit verschwendet
jake