Fehler beim Versuch, zu einem einfacheren rsync Befehl make
Frage
ich normalerweise scp verwenden Sachen zu kopieren, aber jetzt mit dem leistungsfähigeren rsync Befehl Ich versuche zu gewöhnen. Es hilft mir, weniger Bandbreite zu verwenden, indem nur das Kopieren von Dateien auf, die sich geändert haben. Allerdings hat rsync viel komplexer Parameter, also dachte ich, hey, ich werde nur ein wenig Bash-Skript machen, dass es einfach für mich, und rufen Sie den Befehl ‚RSCP‘ macht. Also ging ich so etwas wie diese zu bauen. Beachten Sie in dem folgende Beispiel, dass mein Web-Host verwendet eine andere Port-Nummer neben 22, so dass deshalb der $ 1 für das verwendet wird.
#!/bin/bash
rsync -avzp --progress --rsh='ssh -p$1' $2 $3 $4 $5 $6 $7
So, ihre Nutzung, hoffte ich, wäre so etwas wie:
rscp 3822 --exclude=tiny_mce /var/www/mysite/* root@webhost.com:~/www/mysite
Das würde es ein wenig näher an meine Verwendung des scp-Befehl, Sie zu sehen.
Allerdings, wenn ich dies laufe ich diesen Fehler:
building file list ...
4 files to consider
ERROR: destination must be a directory when copying more than 1 file
rsync error: errors selecting input/output files, dirs (code 3) at main.c(494) [receiver=2.6.9]
rsync: connection unexpectedly closed (8 bytes received so far) [sender]
rsync error: error in rsync protocol data stream (code 12) at io.c(454) [sender=2.6.9]
Aber wenn ich zum regulären rsync Befehl zurück, es funktioniert ganz gut.
Kann jemand herausfinden, was ich falsch mache in meinem Bash-Skript?
Lösung
/ var / www / mysite / * wird von der Shell erweitert, so dass Sie viele weitere Argumente übergeben werden, als Sie im Skript sind Handhabung.
Auch Variablen nicht in einfachen Anführungszeichen ersetzt, so müssen Sie doppelte Anführungszeichen verwenden. (Siehe bash Manpage )
Versuchen Sie folgendes:
#!/bin/bash
PORT=$1
shift
rsync -avzp --progress --rsh="ssh -p$PORT" "$@"
Zuerst nehmen wir den Hafen aus der Argumentliste (mit Shift), dann verwenden wir „$ @“, das speziell ist, bezieht er sich auf das Argument (auf das Skript in diesem Fall), und wird auf alle von ihnen umgewandelt, aber jeweils separat in doppelten Anführungszeichen. (Siehe bash Manpage für weitere Details) .
Andere Tipps
Könnten Sie nicht technisch drehen diese in eine Funktion auch:
rscp() {
rsync -avzp --progress --rsh="ssh -p$PORT" "$@"
}
Und dann, wenn Sie führen Sie es: RSCP 3822