Zum rekursiven Kopieren eines Verzeichnisses scheint es viel schneller zu sein , ein Verzeichnis tar
zu packen und dann die Ausgabe tar
zum Entpacken an ein anderes weiterzuleiten als cp -r
(oder cp -a
).
Warum ist das? Und warum kann man es nicht cp
schneller machen, wenn man es unter der Haube genauso macht?
Bearbeiten: Ich habe diesen Unterschied bemerkt, als ich versucht habe, eine riesige Verzeichnisstruktur zu kopieren, die Zehntausende von Dateien und Ordnern enthält, die tief verschachtelt sind, aber insgesamt nur etwa 50 MB groß sind. Ich bin mir nicht sicher, ob das relevant ist.
Antworten:
Cp
führt open-read-close-open-write-close in einer Schleife über alle Dateien aus. Das Lesen von einem Ort und das Schreiben an einen anderen erfolgt also vollständig verschachtelt.Tar|tar
Liest und schreibt in separaten Prozessen undtar
verwendet außerdem mehrere Threads, um mehrere Dateien gleichzeitig zu lesen (und zu schreiben), sodass der Festplattencontroller effektiv viele Datenblöcke gleichzeitig abrufen, puffern und speichern kann. Alles in allemtar
ermöglicht es jeder Komponente, effizient zu arbeiten, währendcp
das Problem in unterschiedliche, ineffizient kleine Teile aufgeteilt wird.quelle
cp
Implementierungen gilt? Woher wissen wir, dass das stimmt? Und warumcp
sollte so ineffizient geschrieben werden? Jede Lehrbuchimplementierung einer Dateikopie liest einen Puffer von n Bytes gleichzeitig und schreibt sie auf die Festplatte, bevor weitere n Bytes gelesen werden. Aber Sie sagen,cp
liest immer die ganze Datei, bevor Sie die ganze Kopie schreiben?