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

874
sudosnake

Dies ist ein Thema, zu dem ich keine endgültige Antwort gefunden habe, 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 notwendig, aber eine optimale Leistung ist mit einigen Vorbehalten möglich.

  1. Die Dateistruktur von einem Punkt nach unten 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 kann also etwas aussehen /my_drive_b/files/x/.
  2. Die Dateien, die übertragen werden, sind nicht jedes Mal gleich. Daher kann eine Funktion wie rsynceine Funktion nicht wie eine Funktion sein cp.
  3. Die Anzahl der Dateien wird in Tausenden liegen, obwohl alle klein sind.
  4. Die Daten müssen kopiert und aufbewahrt 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/. Mit begrenzter Erfahrung mit Kopierfunktionen unter Linux bin ich mir nicht sicher, ob dies eine optimale Lösung für das Kopieren einer so großen Anzahl von Dateien ist.

3
Ich würde einfach mit 'rsync' gehen Arkadiusz Drabczyk vor 7 Jahren 3
@ArkadiuszDrabczyk Vielen Dank für das Feedback, warum sollten Sie `rsync` wählen? sudosnake vor 7 Jahren 0
1. Ich habe schlechte Erfahrungen mit "scp" gemacht, weil ich viele Daten kopiert habe - ich habe es einmal versucht und es ist abgestürzt. 2. Wenn die Verbindung gestoppt wurde, kopiert `rsync` nicht alles von Anfang an, sondern nur Dateien, die noch nicht kopiert wurden. 3.` rsync` funktioniert sowohl lokal als auch über `ssh`, sodass Sie ein einzelnes Werkzeug mit demselben Werkzeug verwenden können Optionen Arkadiusz Drabczyk vor 7 Jahren 1
"Ich bin nicht sicher, ob dies eine optimale Lösung für das Kopieren einer so großen Anzahl von Dateien ist." Ich denke, die "optimalen" Ergebnisse für maximale Geschwindigkeit hängen von einigen Faktoren ab. Zum Beispiel war Reiserfs dafür bekannt, viele kleine Dateien recht gut zu unterstützen. Je nach verwendetem Dateisystem (oder Betriebssystem) können unterschiedliche Ergebnisse angezeigt werden. Ihre beste Wette könnte sein: Hören Sie auf, viele kleine Dateien zu übertragen, aber um sie in eine Archivdatei zu legen, ist tar wahrscheinlich am weitesten kompatibel und unterstützt Unix-Metadaten, und übertragen Sie dann eine Datei. Die Verwendung von Unix-Paspeln ist möglicherweise glatt, kann jedoch störend sein, wenn Probleme auftreten.) TOOGAM vor 7 Jahren 0

1 Antwort auf die Frage

1
styrofoam fly

Geh einfach mit cp. coreutilssind gut optimiert und werden hervorragend funktionieren. Abgesehen von --archiveFlag sollten Sie die Verwendung in Betracht ziehen --sparse=never, wenn Sie vorhersagen, dass keine Dateien mit geringer Dichte vorhanden sind. Dies wird stumm cpund Zeit sparen.

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

Je nach Größe Ihrer Daten ist es möglicherweise schneller, die gesamte Festplatte (z. /dev/sdaB.) mit Programmen wie ddoder zu kopieren. ddrescueEs ist jedoch schwer zu sagen, wann diese Option schneller ist.