Wie kopiere ich alle Dateien und Verzeichnisse außer bestimmten über ssh?

23

Über die Linux-Befehlszeile benutze ich den scpBefehl, um alle Dateien und Ordner aus einem bestimmten Verzeichnis zu kopieren. Ich mag es jedoch nicht, Bandbreite zu verbrauchen, da ich zum Kopieren nur selten Änderungen an meinem tiny_mceOrdner vornehme. Was ist der Trick, um alles zu kopieren, aber eine kurze Liste von Ordnern zu überspringen?

Michael Prokopec
quelle

Antworten:

19

rsyncFunktioniert einwandfrei und verwendet in den meisten Fällen SSH automatisch als Transportprotokoll. Es werden Dateien verglichen und nur diejenigen hochgeladen, die sich geändert haben. Sie können jedoch auch eine Ausschlussliste verwenden , um Dateien in der Struktur anzugeben, die ohnehin nicht erneut synchronisiert werden sollen.

Anthon
quelle
rsync ist nicht SSH automatisch verwenden - Sie haben die „-e ssh“ Flags zu liefern , das zu tun.
4
Ja tut es. Rsync 2.6.0 veröffentlicht - Die Standard-Remote-Shell ist jetzt "ssh", es sei denn, Sie teilen configure mit, dass Sie etwas anderes als Standard festlegen möchten. samba.org/rsync
12

Sie könnten versuchen, rsync, das nur Dateien kopiert, die sich geändert haben, funktioniert auch über ssh.


quelle
9

Verwenden rsync --excludeist hier die naheliegendere Wahl, aber wenn Sie wirklich nur ein paar Dateien oder Ordner senden und etwas Besonderes ausschließen möchten, können Sie Shell-Globing mit verwenden scp. Stellen Sie zunächst sicher, dass in Ihrer Shell die richtigen Globing-Optionen festgelegt sind. Für Bash Run shopt -s extglobund für zsh setopt ksh_glob. Dann etwa so:

scp /path/to/folder/!(tiny_mce|other_folder|*.bak) user@host:target_path

... kopiert alles in den Quellordner mit Ausnahme von Dingen, die dem angegebenen Muster entsprechen. Natürlich können Sie mit diesem Teil kreativ werden.

Caleb
quelle
7

rsync ist eine gute Lösung, aber wenn Sie nach einer Alternative suchen:

Nehmen wir an, wir haben ein Verzeichnis "test", das die Verzeichnisse "foo, bar, baz" enthält. In diesen Verzeichnissen befinden sich eine Reihe verschiedener Dateitypen:

test
|____bar
| |____1.jpg
| |____1.png
| |____1.txt
| |____2.jpg
| |____2.png
| |____2.txt
|____baz
| |____1.avi
| |____2.avi
| |____3.png
|____foo
| |____test.blah
|____test.txt

Wir wollen alles außer den PNGs kopieren

scp $(find /location/of/test -type f ! -name "*.png") # -> Note the logical NOT!!

In diesem Beispiel werden mit dem Befehl alle Dateien in dasselbe Zielverzeichnis verschoben. Dies ist möglicherweise nicht das gewünschte Verhalten.

Anthon
quelle
1
Beachten Sie, dass diese Antwort nur funktioniert, wenn die beteiligten Datei- und Verzeichnisnamen keine Shell-Sonderzeichen (Whitespace oder \[*?) enthalten.
Gilles 'SO - hör auf, böse zu sein'
3

Ein großartiges Tool, das Sie ausprobieren möchten, ist "lftp".

lftp sftp://etc.etc/ 
lftp> ls 
    --- remote listing ---
lftp> mirror -R -n local/ remote/

Sie können RSync auch über ssh verwenden

rsync -avzp -e ssh /this/dir/  remoteuser@remotehost:/remote/dir/

Sollte arbeiten.

Kent Fredric
quelle
0

Ich habe gerade zu Ende geschrieben, wie ich es vorziehe , jeden Tag unisono zu synchronisieren , seitdem

  • Benötigt keinen Daemon, außer ssh für den Transport
  • Ermöglicht es mir, Dateien jederzeit auf beiden Seiten zu ändern - mehrere Master sind problemlos möglich, während ich nur eine Synchronisierungsanforderung von einer Seite aus senden muss
  • Ich bin ein Stickler, wenn es um Modi, Attribute / Berechtigungen, Softlinks usw. geht. Keine Probleme damit; Für ein Projekt benutze ich sogar 4 Spiegel, von denen einer ein Cygwin-Host ist. Siehe mein Beispiel crontab setup.
  • unterstützt Ausschlüsse wie *.bak. Beispiele in meiner Konfigurationsdatei
Marcos
quelle
0

Verwenden von Secure Copy - scp

scp -r file user@host:

Um viele Dateien zu kopieren

scp /directory/* user@host:destinationPath

So kopieren Sie einige Dateien

scp /directory/!(*.doc) user@host:destinationPath

Es kopiert den Inhalt des Verzeichnisses mit Ausnahme der DOC- Dateien

Yogeesh HT
quelle
0

Ich würde dir auf jeden Fall rsync empfehlen.

rsync -vra --exclude = "was Sie ausschließen möchten" -e ssh Ordner user @ remotehost: / Ordner

amit singh
quelle
0

Das hat bei mir funktioniert, als ich es vom Zielserver aus ausgeführt habe.

rsync -av --progress user@servername:/sourcefolder /destinationfolder --exclude thefoldertoexclude
user2373210
quelle
0

Wir können es in zwei Schritten tun, um das tiny_mceVerzeichnis zu ignorieren . Angenommen, alle Verzeichnisse beginnen mit Kleinbuchstaben.

scp -r USER@HOSTNAME:~/FOLDER/[a-s]* .
scp -r USER@HOSTNAME:~/FOLDER/[u-z]* .

Ändern Sie außerdem USER, HOSTNAME und FOLDER in die tatsächlichen Werte.

Fady Ibrahim
quelle