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?
Antwort
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)
Wie auch immer, um diese Unterordner zu ignorieren, die keine * class-Dateien in ihnen haben? (d. h. ich will keinen Haufen leerer Dirs) –
genial, und das ist auch schnell böse! –
Kannst du erklären --include, not --include = In den MAN Seiten konnte ich Erklärung finden auf --include = aber nicht --include – bazz
Kopieren Sie Ihre Quellordner in
somedir
:cp -r
srcdir
somedir
entfernen alle nicht benötigten Dateien:
finden somedir -name '.svn' exec rm -rf {} \ +
starten scp von
somedir
warum alle downvotes auf diese antwort? Das klingt nach einer Via-Lösung für die Frage. – bcarroll
Da dies eine Reihe unnötiger Dateien kopieren würde, löschen Sie sie und verschwenden möglicherweise viel Zeit. – Oded
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
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.
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.
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
Um dotfiles in Basisverzeichnis auszuschließen:
scp -r [!.]* server:/path/to/something
Dies ist wahrscheinlich die beste Antwort; Mit Globs Dateien zu filtern ist der Weg zu gehen. –
Wenn Ihre Option auf scp beschränkt ist, wie ich hatte, hat dies definitiv geholfen. – user28095
Dies zeigt an, dass Dateien wie gefragt ausgeschlossen werden, aber wie kann dies für ein ganzes Verzeichnis erreicht werden? – Pille
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
Unterhalb Befehl für Dateien.
scp `finden. -maxdepth 1 -name "* .log" \! -name "hs_err_pid2801.log" -type f 'root @ IP:/tmp/test/
- IP wird die Zielserver-IP-Adresse sein.
- -name "* .log" für Include-Dateien.
- \! -name "hs_err_pid2801.log" für Ausschlussdateien.
- . ist das aktuelle Arbeitsverzeichnis.
- -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.
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