Pour copier récursivement un répertoire, utiliser tar
pour emballer un répertoire puis rediriger la sortie vers un autre tar
pour décompresser semble être beaucoup plus rapide que d'utiliser cp -r
(ou cp -a
).
Pourquoi est-ce? Et pourquoi ne peut-on pas cp
faire plus vite en le faisant de la même manière sous le capot?
Edit: j'ai remarqué cette différence en essayant de copier une énorme structure de répertoires contenant des dizaines de milliers de fichiers et de dossiers, profondément imbriqués, mais ne totalisant qu'environ 50 Mo. Je ne sais pas si c'est pertinent.
Réponses:
Cp
fait ouvrir-lire-fermer-ouvrir-écrire-fermer en boucle sur tous les fichiers. Ainsi, la lecture d'un endroit et l'écriture à un autre se produisent entièrement entrelacées.Tar|tar
lit et écrit dans des processus séparés, ettar
utilise en outre plusieurs threads pour lire (et écrire) plusieurs fichiers `` à la fois '', permettant ainsi au contrôleur de disque de récupérer, mettre en mémoire tampon et stocker de nombreux blocs de données à la fois. Dans l'ensemble,tar
permet à chaque composant de fonctionner efficacement, tout encp
décomposant le problème en morceaux disparates et inefficaces.la source
cp
implémentations? Comment savons-nous que c'est vrai? Et pourquoi seraitcp
écrit d'une manière si inefficace? Toute implémentation de manuel d'une copie de fichier lit un tampon de n octets à la fois et les écrit sur le disque avant de lire un autre n octets. Mais vous ditescp
toujours lire tout le fichier avant d'écrire la copie entière?