Dateien von shell aus kopieren
Felix Riesterer
- programmiertechnik
Liebe Mitleser(innen),
neulich lernte ich, [niemals die Macht der Shell zu link:/archiv/2009/10/t192003/#m1280880@title=unterschätzen]. Nun habe ich eine konkrete Anwendung für die Shell.
Ich mache gerade ein Backup auf eine externe Platte. Dabei will ich alle Dateien von a nach b kopieren. Nun ist mir aber der Kopiervorgang abgebrochen, da ich den Fenstermanager neu starten musse (ein verunglücktes Windows-Programm unter Wine hat "Falschfarben" eingestellt). Da der Kopiervorgang über zwei Stunden dauern soll, möchte ich nun nichtmehr von vorne beginnen.
Frage: Wie muss das cp Kommando unter meiner Linux-Shell lauten, dass er nur fehlende Dateien ergänzt, und unvollständige Dateien überschreibt?
Die man page zu CP ist zwar sehr auskunftsfreudig, aber ich finde nichts, was eine existierende Datei, die zu klein ist, betrifft.
Meine bisherige Lösung:
cp -prRu /mnt/sda7/*.* /mnt/sdc1/Spielwiese/*.*
Obigen Code habe ich noch nicht ausprobiert, da ich ja unvollständige Dateien überschreiben möchte, aber eben nur diese. Wie schaufle ich das alles in einen Einzeiler?
Liebe Grüße,
Felix Riesterer.
zweiter Versuch:
cp -pru /mnt/sda7/* /mnt/sdc1/Spielwiese
Aber wo baue ich das mit der Überprüfung auf eine kleinere (besser "ungleiche") Dateigröße ein?
Liebe Grüße,
Felix Riesterer.
Moin Moin!
rsync
(Das geht übrigens nicht nur lokal, sondern auch über rsh, ssh und ein rsync-eigenes Protokoll übers Netz)
Alexander
Lieber Alexander,
rsync
(Das geht übrigens nicht nur lokal, sondern auch über rsh, ssh und ein rsync-eigenes Protokoll übers Netz)
vielen Dank für Deinen Hinweis. Puh! Jetzt muss ich mich noch tiefer in Linux-Programme einarbeiten, da ich als Windosenfuttermapfer bisher um Kommandozeilen-Dingse und solch extrem nützliche Tools habe drücken können.
Wenn mein cp-Kommando beendet ist (läuft nun schon seit Stunden), werde ich das mit diesem rsync ausprobieren.
Frage: Wird das mit rsync deshalb ganz sicher funktionieren, weil sowohl Quell- als auch Zieldatei auf demselben System liegen, sodass kein remote server oder remote client reagieren muss?
Liebe Grüße,
Felix Riesterer.
Moin Moin!
rsync
(Das geht übrigens nicht nur lokal, sondern auch über rsh, ssh und ein rsync-eigenes Protokoll übers Netz)
vielen Dank für Deinen Hinweis. Puh! Jetzt muss ich mich noch tiefer in Linux-Programme einarbeiten, da ich als Windosenfuttermapfer bisher um Kommandozeilen-Dingse und solch extrem nützliche Tools habe drücken können.
Die rsync-man-Page ist eine der besonders gelungenen, die fängt nämlich mit den häufigsten "Zaubersprüchen" für Mausschubser an, ohne dass man sich stundenlang durch irgendwelche exotischen, alphabetisch sortierten Kommandozeilenparameter wühlen muß -- wer das will, kann das allerdings auch haben. Auf der rsync-Homepage gibt's auch noch etwas Doku.
Wenn mein cp-Kommando beendet ist (läuft nun schon seit Stunden), werde ich das mit diesem rsync ausprobieren.
Das schöne an rsync ist, dass man es jederzeit unterbrechen und fortsetzen kann, auch wenn Du schon einen großen Haufen mit cp oder sonstigen Mitteln rüberkopiert hast. Der Trick bei rsync ist einfach ein Fenster, über das permanent mit minimalem Aufwand eine Prüfsumme berechnet wird, so kann rsync genau da fortsetzen, wo es beim letzten Mal unterbrochen wurde, ohne dass man irgendwelche Statusinformationen vorhalten muß. Das kostet natürlich Rechenleistung, ist aber gerade über dünne oder wackelige Internet-Leitungen einfach nur genial.
Frage: Wird das mit rsync deshalb ganz sicher funktionieren, weil sowohl Quell- als auch Zieldatei auf demselben System liegen, sodass kein remote server oder remote client reagieren muss?
rsync hat im Prinzip drei Betriebsarten:
* von local nach local
* von local nach remote
* von remote nach local
Und das schöne daran: Es ist komplett egal, ob Du lokal oder remote arbeitest, rsync macht automatisch das Richtige. Wenn Du eine Seite remote haben willst, stellst Du dem Datei- bzw. Verzeichnisnamen "remote.server.tld:" voran, dann stellt rsync komplett transparent eine Verbindung über rsh, wahlweise und typischerweise über ssh, her und startet auf der remote-Maschine ebenfalls einen rsync-Prozess, um die Daten durch rsh/ssh hin oder her zu schaufeln. Wenn Du rein lokal arbeitest, erzeugt rsync ebenfalls eine zweite Instanz, die aber ganz schnöde über fork() und eine Pipe. Zwischen den beiden passiert aber genau das gleiche wie bei der Aktion über rsh/ssh. Deswegen ist es auch völlig egal, ob Du rein lokal arbeitest oder nicht.
Daneben gibt es noch den Spezialmodus mit zwei Doppelpunkten nach dem Servernamen ODER einer rsync://-URL, dann stellt rsync eine Verbindung über TCP zu einem mehr oder weniger dauerlaufenden rsync-Daemon her. Aber auch da ist nach Herstellen der Verbindung kein Unterschied mehr vorhanden.
Alexander
Lieber Alexander,
herzlichsten Dank!
Liebe Grüße,
Felix Riesterer.