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?


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)

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.


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.


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.


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.


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

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

0
scp -i /home/<user>/.ssh/id_rsa -o "StrictHostKeyChecking=no" -rp /source/directory/path/[!.]* <target_user>@<target_system:/destination/directory/path

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


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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.