Zum rekursiven Kopieren eines Verzeichnisses scheint es viel schneller zu sein, tar
ein Verzeichnis zu packen und die Ausgabe dann zum Entpacken an ein anderes Verzeichnis weiterzuleiten, als (oder ).tar
cp -r
cp -a
Warum ist das so? Und warum kann man es nicht cp
schneller machen, indem man es im Hintergrund genauso macht?
Bearbeiten: Mir ist dieser Unterschied aufgefallen, als ich versucht habe, eine riesige Verzeichnisstruktur mit Zehntausenden tief verschachtelter Dateien und Ordner zu kopieren, die aber insgesamt nur etwa 50 MB groß sind. Ich bin nicht sicher, ob das relevant ist.
Antwort1
Cp
führt Öffnen-Lesen-Schließen-Öffnen-Schreiben-Schließen in einer Schleife über alle Dateien aus. Das Lesen von einer Stelle und das Schreiben an eine andere erfolgt also vollständig verschachtelt. Tar|tar
führt Lesen und Schreiben in separaten Prozessen aus und verwendet zusätzlich tar
mehrere Threads, um mehrere Dateien „auf einmal“ zu lesen (und zu schreiben), wodurch der Festplattencontroller effektiv viele Datenblöcke auf einmal abrufen, puffern und speichern kann. Alles in allem tar
ermöglicht es, dass jede Komponente effizient arbeitet, während cp
das Problem in unterschiedliche, ineffiziente kleine Teile zerlegt wird.
Antwort2
Ihre Bearbeitung geht in die richtige Richtung: cp
ist nicht unbedingt langsamer als tar | tar
. Hängt beispielsweise von der Menge und Größe der Dateien ab. Für große Dateien cp
ist ein einfacher am besten, da es sich um eine einfache Aufgabe handelt, Daten herumzuschieben. Für viele kleine Dateien ist die Logistik anders und tar
könnte einen besseren Job machen. Siehe zum Beispieldiese Antwort.