La commande ditto, l'outil natif de copie macOS

Introduction

La commande ditto est l'utilitaire de copie de fichiers le plus fiable pour préserver l'intégrité complète des données macOS, incluant les resource forks, les attributs étendus, les ACLs et les métadonnées HFS+/APFS.
Développée par Apple et intégrée à macOS depuis la version 10.0, elle surpasse cp pour toute copie locale nécessitant une préservation fidèle des attributs système.
Cependant, son absence de synchronisation incrémentale et de support réseau natif la rend inadaptée aux sauvegardes régulières, où rsync ou des outils tiers (comme Carbon Copy Cloner) dominent.
Néanmoins, pour une copie unique de fichiers macOS avec toutes leurs métadonnées, ditto reste le choix optimal.


Syntaxe complète et référence des options

La syntaxe de ditto diffère fondamentalement de cp : elle copie le contenu d'un répertoire source vers la destination, plutôt que le répertoire lui-même.
Cette distinction est cruciale pour éviter les erreurs de structure.

# Copie basique (copie le CONTENU de src dans dst)
ditto source destination

# Copie avec création automatique de l'arborescence destination
ditto ~/Documents/projet /Volumes/Backup/projet

# Mode verbeux affichant chaque fichier copié
ditto -V ~/Desktop/work /Volumes/external

# Création d'archive ZIP compatible Finder
ditto -c -k --sequesterRsrc --keepParent App.app Archive.zip

# Extraction d'archive ZIP
ditto -x -k archive.zip destination/

# Copie sans métadonnées (compatibilité cross-platform)
ditto --norsrc source destination

Options de préservation des métadonnées

Les options de préservation des métadonnées constituent le cœur de la puissance de ditto.
Depuis macOS 10.5, les options --rsrc, --extattr, --acl et --qtn sont activées par défaut, garantissant une copie fidèle sans configuration supplémentaire.

Gestion des archives

La gestion des archives offre trois formats :

L'option --sequesterRsrc stocke les métadonnées macOS dans un sous-dossier __MACOSX pour compatibilité avec les systèmes non-Apple, tandis que --keepParent intègre le nom du répertoire parent dans l'archive.


Préservation des métadonnées : ce que ditto protège automatiquement

La supériorité de ditto réside dans sa gestion transparente de l'écosystème de métadonnées macOS.

Resource Forks

Les resource forks, vestiges de l'architecture classique Mac OS, sont préservés par défaut depuis macOS 10.4.
Sur les systèmes de fichiers non-natifs (FAT32, NTFS, ext4), ditto crée automatiquement des fichiers AppleDouble (préfixés ._) pour stocker ces données.

Les attributs étendus (xattr)

Les attributs étendus englobent un spectre critique d'informations :

Ditto préserve ces attributs jusqu'à leur limite de 64 MiB par fichier, contrairement à la limite de 128 Ko souvent citée par erreur.

Access Control Lists (ACLs)

Pour les ACLs, ditto maintient les permissions granulaires au-delà du modèle Unix traditionnel.
Cependant, une subtilité importante : ditto ne modifie pas les ACLs des répertoires existants à destination — seuls les fichiers sont mis à jour.

Attribut de quarantaine

L'attribut com.apple.quarantine mérite une attention particulière. Cet attribut étendu, appliqué aux fichiers téléchargés depuis Internet, déclenche le dialogue "Cette application a été téléchargée depuis Internet" de Gatekeeper. Ditto préserve cet attribut par défaut (--qtn), mais l'option --noqtn permet de le supprimer lors de la copie.


Comparaison avec rsync : deux philosophies distinctes

La comparaison ditto/rsync révèle des outils aux philosophies fondamentalement différentes. Ils ne peuvent pas être véritablement comparés. rsync excelle dans la synchronisation incrémentale et le transfert réseau, là où ditto privilégie l'intégrité des métadonnées macOS.

Performances comparées

Configuration de rsync pour macOS

La préservation des métadonnées macOS avec rsync nécessite une configuration spécifique :

Cette fragmentation des options constitue une source d'erreurs fréquente.

Support réseau

Le support réseau natif de rsync via SSH est absent de ditto. Une solution de contournement existe en pipant ditto vers SSH :

ditto -c source - | ssh remote_host ditto -x - /destination

Cette approche reste cependant inférieure à rsync pour les transferts volumineux.


Comparaison avec cp et les outils tiers

Face à cp

Ditto offre trois avantages majeurs par rapport à cp :

Depuis macOS 10.4, cp gère correctement les resource forks avec -p, mais reste moins intuitif pour les copies préservant l'intégrité macOS.

Outils professionnels

Les outils professionnels comme Carbon Copy Cloner (CCC), SuperDuper! et ChronoSync n'utilisent pas ditto comme moteur principal :

Ces outils surpassent ditto pour les sauvegardes régulières grâce à :

CCC, ChronoSync ou SuperDuper étant payants, ils représentent néanmoins un investissement justifié pour les environnements de production.


Fiabilité et comportement en conditions réelles

Intégrité des données

En termes d'intégrité des données, ditto effectue par défaut des copies atomiques : les fichiers sont d'abord écrits temporairement, puis renommés atomiquement, garantissant qu'un fichier destination est toujours complet ou absent. L'option --nonAtomicCopies désactive ce comportement pour des copies marginalement plus rapides au détriment de la sécurité.

Gestion des fichiers volumineux

La gestion des fichiers volumineux ne pose aucun problème : ditto supporte nativement les fichiers de plus de 4 Go (support 64-bit). Pour les archives CPIO, l'option --segmentLargeFiles segmente automatiquement les fichiers dépassant 8 Go.

Problèmes connus

Un problème documenté concerne les archives ZIP corrompues : le processus ditto peut consommer 85%+ du CPU indéfiniment. Ce comportement "runaway" nécessite un arrêt forcé via Activity Monitor. Des erreurs "Invalid Argument" peuvent également survenir avec certains attributs étendus malformés.

Déploiements entreprise

Pour les déploiements entreprise, ditto est régulièrement utilisé dans les scripts Jamf et Munki pour la distribution de configurations. Sa présence native sur tous les Mac et son comportement prévisible en font un choix fiable pour les opérations automatisées simples.


Spécificités APFS, bundles et signature de code

Intégration avec APFS

L'intégration avec APFS apporte des capacités spécifiques. L'option --clone exploite le clonage APFS (copy-on-write) pour des copies quasi-instantanées sur le même volume, sans duplication réelle des données. Cette fonctionnalité ne s'active que pour les copies intra-volume.

Gestion des bundles

La gestion des bundles (.app, .framework, .bundle) illustre un avantage critique de ditto. La documentation Apple Developer insiste :

"Utilisez ditto plutôt que cp pour copier du code. ditto préserve les liens symboliques, essentiels à la structure des frameworks Mac."

Une copie de framework avec cp -r peut briser les symlinks Versions/Current, rendant le bundle inutilisable et cassant la signature de code.

Notarisation Apple

Pour la notarisation Apple, ditto est l'outil recommandé pour créer les archives ZIP :

ditto -c -k --keepParent "MonApp.app" "MonApp.zip"
xcrun notarytool submit MonApp.zip --keychain-profile profil --wait

Les archives créées avec le zip standard peuvent échouer à la notarisation avec l'erreur "The signature of the binary is invalid".

System Integrity Protection

L'attribut SF_RESTRICTED et l'attribut étendu com.apple.rootless, liés à System Integrity Protection, sont préservables via --persistRootless lors de copies de fichiers système.


Limitations majeures et solutions alternatives

Absence d'option --delete

L'absence d'option --delete constitue la limitation la plus significative. Ditto ne supprime jamais les fichiers à destination qui n'existent plus à la source. Pour une synchronisation avec suppression, rsync reste incontournable :

rsync -av --delete /source/ /destination/

Exclusion de fichiers

L'impossibilité d'exclure des fichiers par pattern (équivalent de --exclude de rsync) contraint à utiliser les fichiers BOM (Bill of Materials) avec --bom, une approche nettement moins flexible.

Systèmes de fichiers non-Apple

Concernant les systèmes de fichiers non-Apple :

Versions de documents

Les versions de documents macOS (stockées dans .Document-Revisions-V100) ne sont pas copiées par ditto. Des outils spécialisés comme Revisionist sont nécessaires pour cette préservation.


Quand utiliser ditto versus les alternatives

Privilégiez ditto pour :

Privilégiez rsync pour :

Privilégiez les outils tiers pour :


Conclusion

La commande ditto représente l'approche d'Apple à la copie de fichiers : une intégration profonde avec l'écosystème macOS au détriment de la flexibilité cross-platform. Son point fort réside dans la préservation transparente des métadonnées — resource forks, attributs étendus, ACLs, quarantine — sans configuration particulière. Pour les développeurs macOS, ditto est indispensable pour les archives de notarisation et la copie de frameworks préservant la signature de code.

Cependant, l'absence de synchronisation incrémentale et de support réseau natif la cantonne aux opérations ponctuelles. Une stratégie de sauvegarde robuste combine typiquement ditto pour la copie initiale préservant l'intégrité maximale, puis rsync pour les mises à jour incrémentales. Cette complémentarité exploite les forces de chaque outil plutôt que de forcer l'un dans un rôle inadapté.

Pour les environnements de production exigeant automatisation et fiabilité, les outils commerciaux comme Carbon Copy Cloner — qui utilise précisément rsync modifié sous le capot — offrent l'abstraction nécessaire sans sacrifier la performance.



↑ Haut de page