Optimaler Linux-Kopierbefehl für eine große Anzahl von Dateien

3

Dies ist ein Thema, auf das ich keine endgültige Antwort finden konnte, oder zumindest eines mit einer guten Erklärung, warum eine Lösung besser ist als die andere. Nehmen wir an, ich habe zwei lokale Laufwerke, eines mit zu kopierenden Dateien, eines leer. Eine Rückmeldung ist nicht erforderlich, die Leistung ist jedoch mit ein paar Einschränkungen optimal.

  1. Die Dateistruktur von einem Punkt abwärts muss konsistent sein. Zum Beispiel können die Dateien in dem Verzeichnis gespeichert werden , xwo xbefindet sich unter /my_drive_a/to_copy/files/x/- aber wenn ich es zu kopieren /my_drive_b/, würde Ich mag es nur von zu strukturierenden /files/nach unten. Das Ergebnis könnte also so aussehen /my_drive_b/files/x/.
  2. Die Dateien werden nicht jedes Mal gleich übertragen, daher ist eine Funktion rsyncmöglicherweise nicht vorteilhafter als eine Funktion wie cp.
  3. Die Anzahl der Dateien wird in Tausenden liegen, obwohl sie alle klein sind.
  4. Die Daten müssen kopiert und gespeichert werden my_drive_a.

Mein erster Gedanke wäre einfach zu tun cp -R /my_drive_a/to_copy/files/x/ /my_drive_b/files/x/. Auch hier bin ich mir aufgrund der begrenzten Erfahrung mit Kopierfunktionen unter Linux nicht sicher, ob dies eine optimale Lösung für das Kopieren einer so großen Anzahl von Dateien ist.

Sudosnake
quelle
3
Ich würde einfach mitgehenrsync
Arkadiusz Drabczyk
@ArkadiuszDrabczyk Danke für das Feedback, warum würdest du wählen rsync?
Sudosnake
1
1. Ich habe schlechte Erfahrungen mit dem scpKopieren vieler Daten gemacht - ich habe es einmal versucht und es ist abgestürzt. 2. Wenn die Verbindung unterbrochen wurde, rsyncwerden nicht alle Dateien von Anfang an kopiert, sondern nur die Dateien, die noch nicht kopiert wurden. 3. Funktioniert rsyncsowohl lokal als auch über, sshsodass Sie ein einziges Tool mit denselben Optionen verwenden können
Arkadiusz Drabczyk
"Ich bin nicht sicher, ob dies eine optimale Lösung für das Kopieren einer so großen Anzahl von Dateien ist." Ich denke, dass die "optimalen" Ergebnisse für die maximale Geschwindigkeit von einigen Faktoren abhängen. Zum Beispiel war Reiserfs dafür bekannt, viele kleine Dateien recht gut zu unterstützen. Je nachdem, welches Dateisystem (oder Betriebssystem) Sie verwenden, erhalten Sie möglicherweise unterschiedliche Ergebnisse. Ihre beste Wette könnte sein: Unterbrechen Sie den Versuch, viele kleine Dateien zu übertragen, aber um sie in eine Archivdatei zu kopieren, ist tar wahrscheinlich am weitesten kompatibel und unterstützt Unix-Metadaten. Übertragen Sie dann eine Datei. Die Verwendung von Unix-Piping ist möglicherweise problematisch, wenn auch störend, wenn Probleme auftreten.)
TOOGAM

Antworten:

1

Geh einfach mit cp. coreutilssind gut optimiert und werden hervorragende Leistungen erbringen. Mit Ausnahme von --archiveflag sollten Sie die Verwendung in Betracht ziehen --sparse=never, wenn Sie vorhersagen, dass keine spärlichen Dateien vorhanden sind. Dies wird dumm cpund spart Zeit.

Warum nicht rsync? Es wird versucht, die Dateien zu analysieren, zu sortieren (siehe "SORTIERTE ÜBERTRAGUNGSAUFTRAG" in man rsync) und es ist sehr schwierig, nützliche Fortschrittsinformationen zu drucken, ohne den gesamten Prozess ernsthaft zu behindern. Während einige der Optionen deaktiviert werden können, sind einige obligatorisch und führen zu einer langsameren Ausführungszeit.

Abhängig von der Größe Ihrer Daten ist es möglicherweise schneller, die gesamte Festplatte (z. /dev/sdaB.) mit Programmen wie ddoder zu kopieren ddrescue, aber es ist schwer zu sagen, wann diese Option schneller sein wird.

Styroporfliege
quelle