it-swarm.com.de

Wie filtere ich Dateien, wenn Sie scp rekursiv kopieren?

Ich muss alle .class-Dateien vom Server auf das lokale Verzeichnis kopieren, wobei alle Verzeichnisse reserviert sind. 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, 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 __? 

90
derrdji

Ich würde wahrscheinlich empfehlen, etwas wie rsync zu verwenden, wegen seiner include- und exclude-Flags.

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 zur Angabe von ssh anstelle des Standardwerts (was eigentlich ssh sein sollte)
137
Gavin Gilmour

So schließen Sie Dotfiles im Basisverzeichnis aus:

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

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' [email protected]:/my/dir .

(diese Zeile kopiert rsync von einem entfernten Ordner in den aktuellen Ordner)

Aktuelle Versionen von Rsync-Tunnel werden standardmäßig automatisch über eine SSH-Verbindung hergestellt.

34
Ville Laurikari

Da Sie scp können, sollten Sie ok für ssh sein,
Entweder das folgende Skript ausführen 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)

rückkehr 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 feststellen, dass $(find ...) zu lang ist, um Ihre Tar zu

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

Schließlich, da Sie es in /usr/project/backup/ behalten,
Warum die Extraktion stören? Behalten Sie einfach den tar.bz2, möglicherweise mit Datum + Zeitstempel.

8
nik

Wenn Sie scp tatsächlich verwenden möchten, gibt es einen indirekten Weg Sagen Sie, 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
1
Scott Chu

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

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

Unter dem 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" für Ausschlussdateien.
  4. . ist aktuelles Arbeitsverzeichnis.
  5. -type f für den Dateityp.

Unter dem Befehl für das Verzeichnis.

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

sie können den obigen Befehl entsprechend Ihrer Anforderung anpassen.

0
Suneet Khurana