Frage

Ich brauche alle .class-Dateien vom Server auf lokale, mit allen dir reserviert zu kopieren. z.B. server:/usr/some/unknown/number/of/sub/folders/me.class wird das Problem ist, es gibt viele andere nutzlose Dateien wie .svn-base-Dateien, die ich will nicht werden /usr/project/backup/some/unknown/number/of/sub/folders/me.class. wie kann ich sie filtern, so dass nur ich .class-Dateien scp?

War es hilfreich?

Lösung

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

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 angeben ssh anstelle des Standard (die ssh sein sollte, tatsächlich)

Andere Tipps

Um dotfiles in Basisverzeichnis ausschließen:

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

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

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

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

(diese Zeile Kopie rsync aus fernen Ordnern zu aktuellen)

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

Da Sie können Sie in Ordnung sein scp ssh sollte,
entweder Skript die folgende oder einloggen 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)

wieder zurück (Logout) 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 die $(find ...) finden ist zu lang für Ihre Teer Änderung,

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? Halten Sie einfach die tar.bz2, mit vielleicht ein Datum + Zeitstempel.

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

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

Im Folgenden Befehl für Dateien.

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

  1. IP wird Zielserver-IP-Adresse.
  2. -name "* .log" für Dateien.
  3. \! -name "hs_err_pid2801.log" für Dateien ausschließen.
  4. . dir ist aktuelle Arbeits.
  5. -Typ f für Dateityp.

Im Folgenden Befehl für Verzeichnis.

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

Sie obigen Befehl wie pro Ihre Anforderung anpassen können.

Wenn Sie in der Tat wollen Gebrauch scp, gibt es eine indirekte Art und Weise .Say wir wollen alle .jpg-Datei unter lokalen Ordner '/ src' kopieren in den Ordner '/ dst' in Remote-Server 10.1.1.2 :

#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
  1. Kopieren Sie Ihre Quellordner in somedir:

    cp -r srcdir somedir

  2. Entfernen Sie alle nicht benötigten Dateien:

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

  3. Start scp von somedir

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top